2017-06-29 576 views
2

Mysql DB是我们的应用程序数据库。在我的java代码中,我有一个事务的多个更新。一次事务中多次更新是否会导致死锁?

t = session.beginTransaction(); 
q1.executeUpdate(); 
q2.executeUpdate(); 
q3.executeUpdate(); 
t.commit(); 

注意Q1和Q3更新同桌Q1就像

update table1 set col0 = 'A' where id = 'myId'

和Q3是

update table1 set col0 = 'B' where col0 = 'C'

请问这会造成死锁的麻烦吗?如果是这样,我能在脚本中看到“死锁”异常(我正在使用hibernate实现上述功能)。提前致谢。

回答

1

这段代码没有死锁。

如果您在调用method1和method2的同时创建调用另一个方法(同时调用第一个方法)q3.executeUpdate()和调用q1.executeUpdate()后,可能会死锁

method1(){ 
    q1.executeUpdate(); 
    q2.executeUpdate(); 
    q3.executeUpdate(); 
} 
method2(){ 
    q3.executeUpdate(); 
    q2.executeUpdate(); 
    q1.executeUpdate(); 
} 

阅读14.5.5 Deadlocks in InnoDB

死锁是一种情况,不同的交易是无法进行 因为每个持有锁,其他的需求。由于两个 事务正在等待资源变为可用,所以两个 都不释放它所保存的锁。

事务锁定多个表中的行时会发生死锁 (通过诸如UPDATE或SELECT ... FOR UPDATE之类的语句),但是在 中的顺序相反。当此类陈述锁定索引记录和间隔的范围时,也会发生死锁,每个事务由于计时问题获取一些锁定,但不锁定其他锁定。有关死锁 的示例,请参见第14.5.5.1节“InnoDB死锁示例”。

相关问题