2017-03-31 72 views
0

據我所知,innoDB使用一致的非阻塞機制讀取, ,因此每個事務都有自己的快照。MySql InnoDB可重複讀取意外的鎖定行爲

它也告訴記者,在官方documentation

持續讀不設置就可以訪問,因此其他會話都是免費的,同時讀一致性是修改這些表的表的任何鎖在桌子上進行。

但我意外地遇到問題時,會出現經典的 '讀取/更新' 僵局:

  1. 隔離級別重複讀取(也被轉載與提交讀

  2. 交易1讀取行(不是鎖定共享模式)。

  3. 事務2讀取相同的行(也不鎖定在共享模式)。 然後

  4. 交易1嘗試更新此行。

  5. 交易2也嘗試更新此行。

最後步驟之後,INNODB檢測死鎖(下面有最新DETECTED DEADLOCK): ---------------- 2017年3月31日16時07分: 03 0x1f58 ***(1)TRANSACTION: TRANSACTION 413412,ACTIVE 20秒開始索引讀取 正在使用的MySQL表1,鎖定1 鎖定等待9鎖結構,堆大小1136,6行鎖,取消日誌條目3 MySQL線程ID 33,OS線程句柄8148,查詢ID 102005本地主機127.0.0.1根更新

/* update Order */ update `Order` set ... <fields to update> 

*** (1) WAITING FOR THIS LOCK TO BE GRANTED: 
RECORD LOCKS space id 2151 page no 709 n bits 88 index PRIMARY of table `ooapp2`.`order` trx id 413412 lock_mode X locks rec but not gap waiting 
Record lock, heap no 3 PHYSICAL RECORD: n_fields 54; compact format; info bits 0 

*** (2) TRANSACTION: 
TRANSACTION 413413, ACTIVE 11 sec starting index read 
mysql tables in use 1, locked 1 
9 lock struct(s), heap size 1136, 6 row lock(s), undo log entries 3 
MySQL thread id 28, OS thread handle 8024, query id 102008 localhost 127.0.0.1 root updating 

/* update Order */ update `Order` set ...<fields to update> 

*** (2) **HOLDS THE LOCK(S):** 
RECORD LOCKS space id 2151 page no 709 n bits 88 index PRIMARY of table `ooapp2`.`order` trx id 413413 lock mode S locks rec but not gap 
Record lock, heap no 3 PHYSICAL RECORD: n_fields 54; compact format; info bits 0 

*** (2) WAITING FOR THIS LOCK TO BE GRANTED: 
RECORD LOCKS space id 2151 page no 709 n bits 88 index PRIMARY of table `ooapp2`.`order` trx id 413413 lock_mode X locks rec but not gap waiting 
Record lock, heap no 3 PHYSICAL RECORD: n_fields 54; compact format; info bits 0 

*** WE ROLL BACK TRANSACTION (2) 

我不明白,發生了什麼,爲什麼事務2

持有鎖(S)

所以如果InnoDB的。然而不要使用一致的閱讀與快照和套S-鎖 這樣做不符合官方手冊所寫的事實。

回答

1

不這樣做。如果您可能正在更新一行,但同時需要該值,請使用SELECT ... FOR UPDATE;。只要做到這一點,並忘記tx_isolation。通常情況下,這會導致死鎖延遲。(請參閱innodb_lock_wait_timeout,默認爲過度慷慨的50秒。)

另外,當您在下執行時,得到一個死鎖,重新運行整個事務。無論你如何努力避免它們,僵局都會發生。