事務隔離

huatangzhithree發表於2020-10-11

事務隔離

1. 什麼是事務

事務要保證一組資料庫操作,要麼全成功,要麼全失敗。MySQL MyISAM引擎不支援事務,InnoDB支援。

2. 事務的特性

  • A Atomicity 原子性
  • C Consistency 一致性
  • I Isolation 隔離性
  • D Durability 永續性

3. 多個事務同時執行的問題

  • 髒讀
  • 不可重複讀
  • 幻讀

4. 隔離級別

隔離的越嚴實,效率越低,因此要找一個平衡點。
SQL的隔離級別有:

  • 讀未提交 一個事務沒有提交,它所做的變更就能被別的事務看到。
  • 讀提交 一個事務提交後,它做的變更才會被其他事務看到。
  • 可重複讀 一個事務執行過程中看到的資料跟事務啟動時看到的資料一樣。
  • 序列化 對於同一行記錄,寫會加寫鎖,讀會加讀鎖,出現衝突時,後面的事務必須等待前面的事務。

5. 隔離級別的實現

隔離級別實現上,資料庫裡會建立一個檢視,訪問的時候以檢視的邏輯結果為準。

  • 可重複讀, 這個檢視是啟動時建立的,整個事務存在期間都用好這個檢視。
  • 讀提交,整個檢視是每個SQL語句開始執行的時候建立的,執行的時候會看到記錄上的值。
  • 讀未提交,沒有檢視,直接返回記錄上的最新值。
  • 序列化,隔離級別是直接枷鎖的方式,避免並行訪問。

6. 預設隔離級別

Oracle資料庫的預設隔離級別是讀提交。

7. 事務隔離的實現

在MySQL中,每條記錄在更新的時候會同時記錄一條回滾操作,上一個狀態的值可以通過當前值進行回滾得到。
在這裡插入圖片描述

當前值為4, 不同時刻啟動的事務會看到不同的read-view。

8.MVCC

同一條記錄可以在系統中有多個版本,這就是資料庫的多版本併發控制。

9.什麼時候會刪除回滾日誌

當沒有事務用到回滾日誌的時候,回滾日誌會刪除,也就是系統裡沒有比回滾日誌更早的read-view的時候會刪除日誌。

10.事務的啟動方式

  • 顯式啟動 begin start transaction commit rollback
  • set sutocommit=0

推薦顯式啟動。

相關文章