设table1(A,B,C)
A    B    C
a1   b1   c1
a2   b2   c2
a3   b3   c31)排它锁
新建两个连接
在第一个连接中执行以下语句
begin tran
   update table1
   set A='aa'
   where B='b2'
   waitfor delay '00:00:30'  --等待30秒
commit tran
在第二个连接中执行以下语句
begin tran
   select * from table1
   where B='b2'   
commit tran若同时执行上述两个语句,则select查询必须等待update执行完毕才能执行即要等待30秒2)共享锁
在第一个连接中执行以下语句
begin tran
   select * from table1 holdlock -holdlock人为加锁
   where B='b2' 
   waitfor delay '00:00:30'  --等待30秒
commit tran在第二个连接中执行以下语句
begin tran
   select A,C from table1
   where B='b2' 
   update table1
   set A='aa'
   where B='b2'   
commit tran若同时执行上述两个语句,则第二个连接中的select查询可以执行
而update必须等待第一个连接中的共享锁结束后才能执行 即要等待30秒3)死锁
增设table2(D,E)
D    E
d1   e1
d2   e2
在第一个连接中执行以下语句
begin tran
   update table1
   set A='aa'
   where B='b2' 
   waitfor  delay '00:00:30'
   update table2
   set D='d5'
   where E='e1' 
commit tran
   
在第二个连接中执行以下语句
begin tran
   update table2
   set D='d5'
   where E='e1' 
   waitfor  delay '00:00:10'
   update table1
   set A='aa'
   where B='b2'  
commit tran同时执行,系统会检测出死锁,并中止进程

解决方案 »

  1.   

    死锁及其防止
    死锁Deadlocking 是在多用户或多进程状况下为使用同一资源而产生的无法解
    决的争用状态通俗地讲就是两个用户各占用一个资源两人都想使用对方的资源但
    同时又不愿放弃自己的资源就一直等待对方放弃资源如果不进行外部干涉就将一直
    耗下去
    死锁会造成资源的大量浪费甚至会使系统崩溃在SQL Server 中解决死锁的原则
    是牺牲一个比两个都死强即挑出一个进程作为牺牲者将其事务回滚并向执行此
    进程的程序发送编号为1205 的错误信息而防止死锁的途径就是不能让满足死锁条件的
    情况发生为此用户需要遵循以下原则
      尽量避免并发地执行涉及到修改数据的语句
      要求每个事务一次就将所有要使用的数据全部加锁否则就不予执行
      预先规定一个封锁顺序所有的事务都必须按这个顺序对数据执行封锁例如
    不同的过程在事务内部对对象的更新执行顺序应尽量保持一致
      每个事务的执行时间不可太长对程序段长的事务可考虑将其分割为几个事务
      

  2.   

    http://expert.csdn.net/Expert/topic/1802/1802755.xml?temp=.5001795