以下4個隔離級別 并發(fā)一個比一個高
隔離:
事務4性acid的i , 隔離性Isolation
用適當破壞一致性Consistency 的方式提高并發(fā)
完全的一致性, 就是所有的事務排隊,實在太慢了
太慢了怎么辦?
a轉b, c轉d 2個事務完全可以并行!怎么做呢? 加排他鎖!
SERIALIZABLE 可串行化
排他鎖
相關事務無并發(fā),一個個排隊
但是可以更快
事務一共就4種關系, 讀寫2*2=4
happen-before:
讀讀 讀寫 寫讀 寫寫
讀讀是不會改變數據的, 即使讀的是一個數據, 可以并行
所以可以單獨弄個讀鎖 , 把排他鎖拆成讀寫鎖
讀多寫少, 大大提升了并行度!
REPEATABLE READ 可重復讀
讀讀可并行,
但是讀寫不可并行.
一個事務A,先讀,沒釋放讀鎖, 其他寫的事務還在后面排隊就不能來改這個數據,A在讀這個數據和第一次讀是一樣的結果,就是可重復讀了
同個事務 讀同樣的記錄 結果一致
現在是 讀讀 并行 其他幾種happen-before關系都不能并行, 改進一下 讓讀寫也并行:
READ COMMITED 已提交讀
讀的時候完全不加鎖,沒有讀鎖, 讓讀寫也能并行, 前一個事務A在讀, 沒結束時候,B也可以改同一個資源
讀的時候可以寫
只有寫寫 寫讀不能并行
但是這樣是不可重復讀, 讀完馬上釋放讀鎖, 2次讀之間 可能有其他線程寫了, 導致同一個線程讀2次同個資源 竟然會結果不一樣!
此時,可以并行的是
讀讀 讀寫
寫讀 寫寫 仍然要排隊
下面讓 寫讀 也行并行:
READ UNCOMMITED 未提交讀
寫的時候可以讀
沒提交就被看到了,臟讀
可串行化 | 可重復讀 | 已提交讀 | 未提交讀 | new快照讀MVCC |
---|---|---|---|---|
完全的一致性 | 幻讀 | 不可重復讀 | 臟讀 | 完全的一致性 |
排他鎖 | 讀寫鎖 | 寫鎖 | 寫鎖 | 沒鎖, 用事物ID |
都排隊 | 讀讀不排隊 | 讀讀,讀寫不排隊 | 只有寫寫要排隊 | 都不用排隊,發(fā)現有更新的事務在期間改了,本事務就回滾 |
實際用的MVCC(快照讀)
show variabTes 1ike '%iso%';
當前mysql數據庫事務隔離級別
但是實際上是MVCC
本質是: copy on write
缺點是: 實現復雜, 寫寫并行是樂觀鎖,如果寫很多的情況下效率會低