看看这个roy_88写的
http://blog.csdn.net/roy_88/archive/2008/07/21/2682044.aspx

解决方案 »

  1.   

    数据锁
    1. 锁定:是将指定的数据临时锁起来供我们使用,以防止该数据被别人修改或读取。如要进行事务的过程中,所有被修改的数据会自动锁定,以确保万一失败而必须回滚时,不会受到其他用户的干扰。
    2. 乐观并发性控制:假设发生数据存取冲突的机会很小,在事务中并不会持续锁定数据,而只有在更改数据时才会去锁定数据并检查是否发生存取冲突。
    3. 悲观控制:与乐观控制刚好相反,它会在事务中持续锁定要使用的数据,以确保数据可以正确存取。
    SQL SERVER默认是使用乐观并发控制,因此可以较高的并发性,而系统的动作效率也相对提高。
    4. 数据锁的对象:
    RID(记录)、Key(索引字段)、Page(数据页或索引页)、Extent(8个连续的Page)、Table(整个表)、DB(整个数据库)
    5. 锁的方法:
    (1) 独占式锁(Exclusive Lock):Exclusive锁可禁止其他事务对数据存取或锁定操作。
    (2) 共享式锁(Share Lock):Share锁可将数据设成只读,并禁止其他事务对该数据作Exclusive锁定,但却允许他们事务对数据再作Share锁定。也就是说,数据可以同时被许多事务作Share锁定并读取内容,但不允许作Exclusive锁定或更改内容。
    (3) 更改式锁(Update Lock):Update锁可以和Share锁共存,但禁止其他的Update锁或Share锁。其实Update锁的特性和Share锁完全一样(数据只能只读),但Update锁在需要更改数据时,可以自动升级为Exclusive锁并进行更改,当然前提条件是当时已没有其他的Share锁存在。
     
    6. 死锁(DeadlLock)和阻塞(Block):
    死锁:当多个事务的手中都锁定了某些资源,却又在等待另外一些被彼此锁定的资源时,就会发生死锁。
    阻塞:当事务中要使用的资源已被其他事务锁定,而导致必须等待时,即称为被“阻塞(Bolck)”了。可以设置事务在被Block时的等待时间,并检测@@ERROR=1222的错误来作超时处理。7. 避免死锁发生的技巧:
    (1) 使用相同的顺序来存取数据:如果每个要存取A、B、C三个数据表的事务都是以A->B->C的顺序来存取,那么就不会发生死锁。因为只有在第一个锁定A的人才能去锁定B,然后才能去锁定C,因此不会有交互Block的状况发生。
    (2) 尽量缩短事务的时间:时间越短,占用资源的时间也越短,而发生死锁的几率自然也就减少。
    (3) 尽量使用较低的隔离等级:较低隔离等级的数据锁可以供较多人同时读取,因此不易发生死锁。