2017-06-29 166 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死鎖示例」。