日期:2014-05-18  浏览次数:20383 次

sql 死锁问题求解释
增设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  

同时执行,系统会检测出死锁,并中止进程?
为什么发生死锁,请高手解释,谢谢!

------解决方案--------------------
两个事务中都有update table1
------解决方案--------------------
两个事务都同时请求update同一个表操作,造成相互等待对方释放资源
------解决方案--------------------
update必须等待第一个事务释放共享锁转为排它锁后才能执行.
------解决方案--------------------
连线1,持有table1的锁,申请table2的锁,等待..

连线2,持有table2的锁,申请table1的锁,等待..

俩进程进入互相等待对方资源的状态,所以死锁.
------解决方案--------------------
探讨
引用:
两个事务都同时请求update同一个表操作,造成相互等待对方释放资源


同时update 同一个表的操作这种情况会有吧?
如何改进这种死锁的问题?