1、事務四大特性
- 原子性(Atomicity):事務開始後所有操作,要麼全部做完,要麼全部不做,不可能停滯在中間環節。事務執行過程中出錯,會回滾到事務開始前的狀態,所有的操作就像沒有發生一樣。
- 一致性(Consistency):事務開始前和結束後,資料庫的完整性約束沒有被破壞 。
- 隔離性(Isolation):同一時間,只允許一個事務請求同一資料,不同的事務之間彼此沒有任何干擾。
- 永續性(Durability):事務完成後,事務對資料庫的所有更新將被儲存到資料庫,不能回滾。
2、事務的併發問題
- 髒讀:事務A讀取了事務B更新的資料,然後B回滾操作,那麼A讀取到的資料是髒資料
- 不可重複讀:(事務 A 多次讀取同一資料,事務 B 在事務A多次讀取的過程中,對資料作了更新並提交,導致事務A多次讀取同一資料時,結果 不一致。)(重點:資料修改)
- 幻讀:系統管理員A將資料庫中所有學生的成績從具體分數改為ABCDE等級,但是系統管理員B就在這個時候插入了一條具體分數的記錄,當系統管理員A改結束後發現還有一條記錄沒有改過來,就好像發生了幻覺一樣,這就叫幻讀。(重點:資料新增或刪除)
小結:不可重複讀的和幻讀很容易混淆,不可重複讀側重於修改,幻讀側重於新增或刪除。解決不可重複讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表
3、MySQL事務隔離級別
- 未提交讀(READ UNCOMMITED)(沒提交的資料可讀,髒讀,這些資料稱為髒資料)
- 已提交讀(READ COMMITED)(已提交的資料可讀,不可重複讀)
- 可重複讀(RePEATABLE READ)一個事務執行過程中看到的資料,總是跟這個事務在啟動時看到的資料是一致的。當然在可重複讀隔離級別下,未提交變更對其他事務也是不可見的。
- 可序列化(SERIALIZABLE)(讀操作會隱式獲取共享鎖,可以保證不同事務間的互斥,鎖表,別想搞什麼鬼,缺點也很明顯,看到鎖表你就懂的哈,效率問題)
事務隔離級別 | 髒讀 | 不可重複讀 | 幻讀 |
---|---|---|---|
讀未提交(read-uncommitted) | 是 | 是 | 是 |
不可重複讀(read-committed) | 否 | 是 | 是 |
可重複讀(repeatable-read) | 否 | 否 | 是 |
序列化(serializable) | 否 | 否 | 否 |
本作品採用《CC 協議》,轉載必須註明作者和本文連結