0
Tx 1: lock A, then B Tx 2: lock B, then A
因爲InnoDB的內部,你會-are-到 體驗死鎖開始交易。
沒有辦法逃脫它。
我看到錯誤代碼1213,當許多線程試圖插入具有相同的PK行,但我不明白如何可能有兩個鎖。那行上只有一個鎖嗎?
Tx 1: lock A, then B Tx 2: lock B, then A
因爲InnoDB的內部,你會-are-到 體驗死鎖開始交易。
沒有辦法逃脫它。
我看到錯誤代碼1213,當許多線程試圖插入具有相同的PK行,但我不明白如何可能有兩個鎖。那行上只有一個鎖嗎?
如果它是read lock
那麼可以有多於一個,因爲讀鎖是共享的,但在任何時候只能有一個write lock
。每個DML操作(insert/update/delete
)都將對隱式事務進行操作,並對該行保持行級別的鎖定,因此,如果任何其他線程試圖在該特定行上執行寫操作,則必須等待現有鎖被釋放,因爲寫鎖是獨家鎖。
情況下,你已經張貼的Tx 1:鎖A,則B的Tx 2:鎖B,那麼A肯定會導致爲deadlock
,這就是爲什麼鎖定發生在兩個階段。 Growing phase
當事務將獲取所有需要的鎖來執行事務並且當它將開始釋放該事務所持有的鎖時。