![](https://img2023.cnblogs.com/blog/3076680/202306/3076680-20230602231102469-1389179464.png) # 1. 基礎思想 ## 1.1. 預寫日誌記錄 ## 1.2. 兩階段提交 ## 1.3. 關係資料庫 # 2 ...
03_事務隔離
事務隔離
事務需要保證一組資料庫操作,要麼全部成功,要麼全部失敗;
MySQL事務隔離性是保證數據一致性和併發控制的重要手段之一,它對於多個事務同時訪問和修改同一數據的情況下,能夠保證事務之間的獨立性和隔離性,避免數據的不一致和衝突。
ACID是MySQL事務的四個特性,其中隔離性是指多個併發事務之間相互隔離,互不幹擾,每個事務僅能看到自己的修改,而不能看到其他事務的修改。
- ACID概念最早由IBM的研究員在20世紀80年代提出,主要是為瞭解決資料庫併發控制和數據一致性的問題,並逐漸成為了資料庫事務的標準特性。
- ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔離性、持久性)
隔離級別
MySQL中有四種隔離級別,包括讀未提交、讀提交、可重覆讀和串列化。
- 讀未提交(read uncommitted)
- 讀提交(read committed)
- 可重覆讀(repeatable read)、
- 串列化(serializable )
其中,讀未提交是最低的隔離級別,它允許一個事務讀取另一個事務未提交的數據,可能會出現臟讀、不可重覆讀和幻讀的問題。
讀提交是一個事務提交後才能被其他事務看到,避免了臟讀的問題,但可能會出現不可重覆讀和幻讀的問題。
可重覆讀是MySQL預設的隔離級別,它保證了在一個事務執行期間,讀取的數據是一致的,不會出現臟讀、不可重覆讀和幻讀的問題。
串列化是最高的隔離級別,它通過加鎖的方式保證了事務的串列執行,避免了所有併發問題,但會導致性能問題。
事務隔離的實現
MySQL的事務隔離性是通過多版本併發控制(MVCC)來實現的,它通過為每個事務創建一個獨立的視圖來保證事務之間的隔離性。
- 在可重覆讀隔離級別下,視圖是在事務啟動時創建的,整個事務存在期間都使用這個視圖。
- 在讀提交隔離級別下,視圖是在每個SQL語句開始執行時創建的。
- 而在讀未提交隔離級別下直接返回記錄上的最新值,沒有視圖概念。
- 在串列化隔離級別下,直接用加鎖的方式來避免併發訪問。
同時,MySQL在實現MVCC時,每條記錄在更新時都會同時記錄一條回滾操作,同一條記錄在系統中可以存在多個版本,回滾日誌會在不需要的時候被刪除。
最後,需要註意的是,長事務會導致系統裡面存在很老的事務視圖,這些事務可能會訪問資料庫裡面的任何數據,導致大量占用存儲空間,因此建議儘量避免使用長事務。
預設隔離級別
Oracle 資料庫的預設隔離級別其實是:讀提交;
MySQL 資料庫的預設隔離級別是:可重覆讀。