不介紹概念,記錄要點
mysql對acid的實現
隔離性的實現原理就是鎖,因而隔離性也可以稱爲併發控制、鎖等。
事務的隔離性要求每個讀寫事務的對象對其他事務的操作對象能互相分離。
原子性、一致性和持久性由數據庫的 redo log 和 undo log 實現。
redo log 稱爲重做日誌,用來保證事務的原子性和持久性,恢復提交事務修改的頁操作。
undo log 來保證事務的一致性,undo 回滾行記錄到某個特性版本及 MVCC 功能。兩者內容不同。redo 記錄物理日誌,undo 是邏輯日誌。
Innodb在RR級別如何避免幻讀:
- 在快照讀讀情況下,mysql通過mvcc來避免幻讀。
- 在當前讀讀情況下,mysql通過next-key來避免幻。
什麼是next-key鎖
行鎖+GAP間隙鎖
行級別鎖的三種算法:
- Record lock
- Gap lock
- Next-Key lock
record lock 按照索引記錄加鎖,如果沒有則採用隱式的主鍵來鎖定。
next-key 結合了Gap lock 和 record lock ,例如索引值:10,11,13,20。則按next-key 鎖定的區間爲(-∞,10],(10,11]
,(11,13],(13,20],(20,+∞)
注意此處指非唯一索引,如果是唯一索引,會降級爲Record lock ,僅僅鎖住索引本身,而非範圍。同時這種降級只發生在查詢所有索引列的情況下,如果存在聯合索引且只是查詢聯合索引的某一列,即屬於range類型查詢,仍是採用Next-key鎖定,不會降級。
什麼是快照讀和當前讀
快照讀:簡單的select操作,屬於快照讀,不加鎖。
select * from table where ?;
當前讀:特殊的讀操作,插入/更新/刪除操作,屬於當前讀,需要加鎖。
select * from table where ? lock in share mode;
select * from table where ? for update;
insert into table values (…);
update table set ? where ?;
delete from table where ?;
參考:
https://www.jianshu.com/p/4e102e55d7de
https://www.cnblogs.com/fanguangdexiaoyuer/p/10759746.html
下邊的文章真的很系統全面: