髒讀(Dirty Read)
一個事務讀取到另一個事務還沒提交的數據叫髒讀。
例如,事務A修改了一行數據,但沒有提交,事務 B讀取了被事務A修改後的數據,之後事務A因爲某種原因Rollback了,那麼事務B讀取的數據就是髒的。
幻讀(Phantom Read)
事務在操作過程中進行兩次查詢,第二次查詢的結果包含了第一次查詢中未出現的數據或者缺少了第一次查詢中出現的數據。
例如,A和B事務併發執行,A事務查詢數據,B事務插入或者刪除數據,A事務再次查詢發現結果集中有以前沒有的數據,或者以前有的數據消失了,彷彿出現了幻覺。
幻讀經常發生在insert操作。
不可重複讀(NonRepeatable Read)
一個事務先後讀到另一個事務提交之前的數據和已提交的更新數據。
A和B事務併發執行,A事務查詢數據,然後B事務更新該數據,A再次查詢該數據時,發現該數據變化了。
不可重複讀經常發生在update和delete操作。
讀未提交(Read Uncommitted)
讀事務不阻塞其他讀事務和寫事務,未提交的寫事務阻塞其他寫事務但不阻塞讀事務。
此隔離級別可以防止更新丟失,但不能防止髒讀、不可重複讀、幻讀。
讀已提交(Read Committed)
讀事務允許其他讀事務和寫事務,未提交的寫事務禁止其他讀事務和寫事務。
讀未提交可以防止更新丟失、髒讀,但不能防止不可重複讀、幻讀。
可重複讀(Repeatable Read)
以操作同一行數據爲前提,讀事務禁止其他寫事務但不阻塞讀事務,未提交的寫事務禁止其他讀事務和寫事務。
此隔離級別可以防止更新丟失、髒讀、不可重複讀,但不能防止幻讀。
可串行化(Serializable)
提供嚴格的事務隔離,它要求事務序列化執行,事務只能一個接着一個地執行,不能併發執行。
此隔離級別可以防止更新丟失、髒讀、不可重複讀、幻讀。
如果僅僅通過“行級鎖”是無法實現事務序列化的,必須通過其他機制保證新插入的數據不會被剛執行查詢操作的事務訪問到。
原子性 (Atomicity)
一個事務(transaction)中的所有操作,要麼全部完成,要麼全部不完成,不會結束在中間某個環節。
事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。
一致性(Consistency)
在事務開始之前和事務結束以後,數據庫的完整性沒有被破壞。
即事務前後,數據庫的狀態都滿足所有的完整性約束。
隔離性(Isolation)
數據庫允許多個併發事務同時對其數據進行讀寫和修改的能力,隔離性可以防止多個事務併發執行時由於交叉執行而導致數據的不一致。
事務隔離分爲不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重複讀(repeatable read)和串行化(Serializable)。
持久性 (Durability)
事務處理結束後,對數據的修改就是永久的,即便系統故障也不會丟失。
這個是有歷史原因的,當然要從我們的主從複製開始講起了!
主從複製,是基於什麼複製的?
是基於binlog複製的!這裏不想去搬binlog的概念了,就簡單理解爲binlog是一個記錄數據庫更改的文件吧~
binlog有幾種格式?
OK,三種,分別是
- statement:記錄的是修改SQL語句
- row:記錄的是每行實際數據的變更
- mixed:statement和row模式的混合
那Mysql在5.0這個版本以前,binlog只支持STATEMENT
這種格式!而這種格式在讀已提交(Read Commited)這個隔離級別下主從複製是有bug的,因此Mysql將可重複讀(Repeatable Read)作爲默認的隔離級別!
- https://blog.csdn.net/weixin_39742568/article/details/110814945
- https://www.cnblogs.com/shoshana-kong/p/10516404.html