一些回顾和总结 1

1、多态

这里主要总结 virtual  override  和 new 的作用
有三个类A,B,C, B和C都继承了A,其中有的方法被重写,有的方法被覆盖:
    public class A
    
{
        
public A(){}

        
public virtual void show()
        
{
            Console.Write(
"show a");
        }


        
public void show2()
        
{
            Console.Write(
"a");
        }

    }


    
public class B:A
    
{
        
public B(){}

        
public override void show()
        
{
            Console.Write(
"show b");
        }

    }


    
public class C:A
    
{
        
public C(){}
        
        
public new void show()
        
{
            Console.Write(
"show c");
        }

        
        
public new void show2()
        
{
            Console.Write(
"c");
        }

    }


        
private void button1_Click(object sender, System.EventArgs e)
        
{
            A a;
            B b 
= new B();
            
            a 
= b;
            a.show();
            b.show();
            a.show2();
            b.show2();
        }


        
private void button2_Click(object sender, System.EventArgs e)
        
{
            A a;
            C c 
= new C();

            a 
= c;
            a.show();
            c.show();
            a.show2();
            c.show2();
        }


    
/*
    结果: 
    button1_Click:
    show b
    show b
    a
    a
    
    button2_Click:
    show a
    show c
    a
    c
    
*/

从结果可以分析知:
下面说的的声明类指A, 实例类指B或C
方法的调用顺序是:
if(声明类中的这个方法是虚方法)//例如show()方法
{
  if(引用的那个实例类override了此方法)
   return 引用的这个实例类的方法 // 例如A a = new B();  a.show()返回的是"show b"
 else
   return 声明类的方法 // 例如 A a = new C(); a.show()返回的是"show a",不管实例类是否覆盖(new)了此方法
}
else
  return 声明类的方法 //例如 show2()方法,A a = new C(); a.show2()返回的是"a"。

另外:
如果声明类中没有对此方法的声明,则需要调用其父类中的方法,例如:A a = new B();  a.show2()返回的是"a",因为中没有对方法show2()重写或覆盖。

2、强名称

用强名称主要有两个好处:区分程序集,避免程序集被恶意更改。
强名称的机制:
首先,你通过SN.exe获得一个公钥和一个密钥。
然后,使用公钥对程序集的可执行文件(不包括DOS头、PE头等)进行哈希算法,得到一个文件散列值。
最后,使用密钥对文件散列值进行加密,得到一个密文。
这样,最后的强名称程序集里面要三样东西:
l 公钥标识(公钥的散列值的最后八个字节)
l 公钥
l 密文
使用公钥和程序集的可执行文件(不包括DOS头、PE头等)进行哈希算法可以得到一个文件散列值,使用公钥和密文也可以得到一个文件散列值,如果这两个散列值完全一致,OK,验证通过。
公钥标识(公钥的散列值的最后八个字节)的作用:
l 区分程序集,上面提到过它是程序集区分彼此的四大属性之一
l 验证公钥

3、事务

一 事务的属性

事务具有ACID属性
即 Atomic原子性, Consistent一致性, Isolated隔离性, Durable永久性

原子性

就是事务应作为一个工作单元,事务处理完成,所有的工作要么都在数据库中保存下来,要么完全
回滚,全部不保留

一致性
事务完成或者撤销后,都应该处于一致的状态

隔离性

多个事务同时进行,它们之间应该互不干扰.应该防止一个事务处理其他事务也要修改的数据时,
不合理的存取和不完整的读取数据

永久性
事务提交以后,所做的工作就被永久的保存下来

二 事务并发处理会产生的问题

丢失更新

当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题、
每个事务都不知道其它事务的存在。最后的更新将重写由其它事务所做的更新,这将导致数据丢失。

脏读
当第二个事务选择其它事务正在更新的行时,会发生未确认的相关性问题。
第二个事务正在读取的数据还没有确认并且可能由更新此行的事务所更改。

不可重复读

当第二个事务多次访问同一行而且每次读取不同的数据时,会发生不一致的分析问题。
不一致的分析与未确认的相关性类似,因为其它事务也是正在更改第二个事务正在读取的数据。
然而,在不一致的分析中,第二个事务读取的数据是由已进行了更改的事务提交的。而且,不一致的分析涉及多次(两次或更多)读取同一行,而且每次信息都由其它事务更改;因而该行被非重复读取。

幻像读

当对某行执行插入或删除操作,而该行属于某个事务正在读取的行的范围时,会发生幻像读问题。
事务第一次读的行范围显示出其中一行已不复存在于第二次读或后续读中,因为该行已被其它事务删除。同样,由于其它事务的插入操作,事务的第二次或后续读显示有一行已不存在于原始读中。

三 事务处理类型

自动处理事务

系统默认每个T-SQL命令都是事务处理 由系统自动开始并提交

隐式事务

当有大量的DDL 和DML命令执行时会自动开始,并一直保持到用户明确提交为止,切换隐式事务可以用SET IMPLICIT_TRANSACTIONS
为连接设置隐性事务模式.当设置为 ON 时,SET IMPLICIT_TRANSACTIONS 将连接设置为隐性事务模式。当设置为 OFF 时,则使连接返回到自动提交事务模式

用户定义事务

由用户来控制事务的开始和结束 命令有: begin tran commit tran rollback tran 命令

分布式事务
跨越多个服务器的事务称为分布式事务,sql server 可以由DTc microsoft distributed transaction coordinator
来支持处理分布式事务,可以使用 BEgin distributed transaction 命令启动一个分布式事务处理

 

四 事务处理的隔离级别

使用SET TRANSACTION ISOLATION LEVEL来控制由连接发出的所有语句的默认事务锁定行为

从低到高依次是

READ UNCOMMITTED

执行脏读或 0 级隔离锁定,这表示不发出共享锁,也不接受排它锁。当设置该选项时,可以对数据执行未提交读或脏读;在事务结束前可以更改数据内的数值,行也可以出现在数据集中或从数据集消失。该选项的作用与在事务内所有语句中的所有表上设置 NOLOCK 相同。这是四个隔离级别中限制最小的级别。

参考自http://www.study888.com/computer/data/sqlsl/200506/42604.html


4、接口与抽象类

接口用于规范,抽象类用于共性。

创建一个接口就是创建了一个或多个方法的定义,在每个实现该接口的类中必须实现这些方
法。系统不会生成任何默认的方法代码,必须自己完成实现过程。接口的优点是它提供了一种让一
个类成为两个类的子类的方式:一个是继承,一个来自子接口,如果实现该接口的类漏掉了一个接
口方法,编译器会产生错误。
    创建—个抽象类就是创建了这样一个基类.它可能有一个或多个完整的、可以工作的方法,但
至少有一个方法未实现并声明为抽象的。不能实例化一个抽象类,而必须从它派生出类,这些类包
含了抽象方法的实现过程。如果一个抽象类的所有方法在基类中都未实现,它在本质上就等同于一
个接口。抽象类的作用是对派生类如何工作提供一个基类定义,允许程序员在不同的派生类中填充这
些实现过程。

抽象类一般作为公共的父类为子类的扩展提供基础,这里的扩展包括了属性上和行为上的。而接口一般来说不考虑属性,只考虑方法,使得子类可以自由的填补或者扩展接口所定义的方法。


5、游标
游标使用的步骤
声明、打开、循环读取、关闭、释放内存
DECLARE cursor_name [INSENSITIVE] [SCROLL] CURSOR
FOR select_statement
[FOR {READ ONLY | UPDATE [OF column_name [,...n]]}]

待续……
posted on 2005-10-12 13:04  Michael J  阅读(511)  评论(0编辑  收藏  举报