-
InnoDB下,mysql四個級別隔離下加鎖操做mysql
- 四個級別隔離的寫操做都加X鎖
- 串行化下讀加S鎖
- select ... for update, select ... lock in share mode 分別加x鎖,s鎖
- 在須要加鎖的場景下,會根據狀況使用三種加鎖策略(算法)
- Record Lock
- Gap Lock
- Next-Key Lock
-
mysql RR 爲啥能隔離幻讀算法
- 快照讀 select
- 當前讀 select for update, select lock in share mode, delete,insert,update
-
InnoDB提供了一致性的非鎖定讀、行級鎖支持sql
-
Lock 與Latch數據庫
- Lock 主要用於鎖定數據庫中的對象,如表、頁、行,而Latch主要是線程併發上的資源鎖定。
- Latch的實現採用了樂觀spin-wait,因此在競爭比較激烈的併發環境下,性能不是很好,是一種輕量鎖。
- Latch
- mutex(互斥liang)
- rwlock(讀寫鎖)
- Lock
- 行鎖、表鎖、頁鎖
- 在沒有索引的狀況下,通常是鎖全表的全部行,而後逐行判斷解鎖
- 沒有實現鎖升級
-
行級鎖併發
- 共享鎖(S Lock)
- 排他鎖 (X Lock)
- S與S兼容,而X與什麼都不兼容
-
意向鎖(事務在更細的粒度上加鎖)性能
- 意向共享鎖(IS Lock) ,事務想要得到一張表中某幾行的共享鎖
- 意向排他鎖(IX Lock),事務想要得到一張表中某幾行的排他鎖
- InnoDB的意向鎖是表級別的鎖
-
一致性的非鎖定讀線程
- 經過行多版本控制的方式來讀取當前執行時間數據中行的數據。
- 若是當前行的X鎖已經被得到,那麼經過undo 段,來得到X鎖被得到前的快照,返回該快照的數據
- 非鎖定讀,不須要X鎖的釋放就能夠進行操做。能夠等同於在事務開始時得到全局快照,在事務運行期間,不管其餘事務是否對數據進行提交,都不影響。
-
一致性鎖定讀版本控制
- SELECT...FOR UPDATE (加X鎖)
- SELECT... LOCK IN SHARE MODE (加S鎖)
-
自增加與鎖對象
- SELECT MAX(auto_inc_col) FROM t FOR UPDATE;
-
外鍵和鎖索引
- 對外鍵值的插入和更新的時候,須要讀父表,這時不能採用一致的非鎖定讀,不然會出現子表與父表不一致的現象。因此須要採用一致性讀,也就是給父表加S鎖。
-
行鎖的三種算法
- Record Lock: 單個行記錄上的鎖
- Gap Lock: 間隙鎖,鎖定一個範圍,不包含記錄自己
*
- Next-Key Lock: Gap Lock + Record Lock, 鎖定一個範圍,而且鎖定記錄自己
-
InnoDB經過Next-key Lock避免了幻讀問題
- 經過加兩個間隙鎖,來保證對於insert,delete操做不會形成幻讀
-
全部隔離級別都實現了寫寫互斥
-
四種隔離級別
- 讀未提交
- 讀讀不互斥、讀寫不互斥、寫寫互斥(不是沒有加鎖!!!!)
- 讀已提交(一致性的非鎖定讀)
- 讀讀不互斥、讀寫不互斥、寫寫互斥
- 每次讀都是讀的最新快照 (避免了髒讀,經過undo log實現)
- 可重複讀(一致性的非鎖定讀)
- 讀讀不互斥、讀寫不互斥、寫寫互斥
- 每次讀都是事務開始時的最新快照 (避免了髒讀,不可重複讀, 經過undo log實現)
- 串行化
- 讀讀不互斥、讀寫互斥、寫寫互斥
- 讀讀加的是S鎖
- 容易發生死鎖
-
死鎖