2016-03-07 100 views
0

我知道InnoDB可以檢測並解決行級的死鎖,但是當您使用LOCK TABLES時會發生什麼?使用鎖表時InnoDB死鎖

由於某些原因,我發現它偶爾更容易鎖定整個表,而不是找出避免潛在死鎖的邏輯。

所以,讓我們假設你做的事:

LOCK TABLES tableA WRITE, tableB WRITE 

現在,兩筆交易(T1T2),同時嘗試這一點。出於某種原因,我們假設T1無法獲得tableA的鎖定,但可以獲得tableB的鎖定。 然後T2出現,得到tableA鎖定,但不在tableBT1有那個)。這兩個現在在等待對方。怎麼了?

  1. 這是如何授予鎖;不管LOCK TABLES指定的順序如何?如果不是,那麼這是不是意味着兩個相同的陳述永遠不會彼此僵化?
  2. 有沒有辦法正確處理這個問題?它必須超時嗎?

根據手冊,它沒關係交易中使用LOCK TABLES,按指定的位置:https://dev.mysql.com/doc/refman/5.7/en/lock-tables-and-transactions.html

回答

0

LOCK TABLES(和你需要說READWRITE等)將鎖定所有表同時。兩個多表LOCK語句沒有機會陷入僵局。 UNLOCK TABLES同時解鎖它們。

+0

哦,是的,忘記了R/W部分(在我的問題中顯然)。很好,謝謝。 – nickdnk