【mysql】- 事務隔離級別和MVCC篇
阿新 • • 發佈:2020-07-14
概念
術語
- 髒寫( Dirty Write ): 如果一個事務修改了另一個未提交事務修改過的資料,那就意味著發了
髒寫
- 髒讀( Dirty Read ) : 如果一個事務讀到了另一個未提交事務修改過的資料,那就意味著發了
髒讀
- 不可重複讀(Non-Repeatable Read): 如果一個事務只能讀到另一個已經提交的事務修改過的資料,並且其他事務每對該資料進行一次修改並提交後,該事務都能查詢得到最新值,那就意味著發了
不可重複讀
- 幻讀(Phantom): 如果一個事務先根據某些條件查詢出一些記錄,之後另一個事務又向表中插入了符合這些條件的記錄,原先的事務再次按照該條件查詢時,能把另一個事務插入的記錄也讀出來,那就意味著發了
幻讀
隔離級別
- READ UNCOMMITTED :未提交讀。
- READ COMMITTED :已提交讀。
- REPEATABLE READ :可重複讀。
- SERIALIZABLE :可序列化。
對應隔離級別問題
- READ UNCOMMITTED 隔離級別下,可能發生
髒讀
、不可重複讀
和幻讀
問題 - READ COMMITTED 隔離級別下,可能發生
不可重複讀
和幻讀
問題,但是不可以發生髒讀
問題 - REPEATABLE READ 隔離級別下,可能發生
幻讀
問題,但是不會發生髒讀
和不可重複讀
的問題 - SERIALIZABLE 隔離級別下,各種問題都不可以發生。
MySQL
的預設隔離級別為REPEATABLE READ
MVCC(多版本併發控制)
- 在使用
READ COMMITTD
、REPEATABLE READ
這兩種隔離級別的事務在執行普通的SEELCT
操作時訪問記錄的版本鏈的過程,這樣使可以使不同事務的讀-寫
、寫-讀
操作併發執行,從而提升系統性能 READCOMMITTD
、REPEATABLE READ
這兩個隔離級別的一個很大不同就是:生成ReadView
的時機不同,READ COMMITTD
在每一次進行普通SELECT
操作前都會生成一個ReadView
,REPEATABLE READ
只在第一次進行普通SELECT
操作前生成一個ReadView
,之後的查詢操作都重複使用這個ReadView
就好了