1. 程式人生 > ><事務隔離性>

<事務隔離性>

一個 over alt 多次 事務隔離級別 無效 提交 ble overview

Overview

  • 事務的隔離性是指在並發環境中,並發的事務是隔離的。一個事務的執行不能被其他事務幹擾。
  • 也即,不同的事務並發操作相同數據時,每個事務都有各自完整的數據空間。

隔離性

  • 在標準SQL規範中,定義了4個事務隔離級別,不同的隔離級別對事務的處理不同,包括:
    • 未授權讀取,也稱為讀未提交(Read Uncommitted)。該級別允許臟讀取,其隔離級別最低。[關於臟讀,幻讀,blabla...請往下拉]。如果一個事務正在處理某一數據,並對其進行了更新,但同時尚未完成事務,因此還未進行事務提交;而與此同時,另一個事務也能訪問該數據。
    • 授權讀取,也稱為讀已提交(Read Commited), 它和未授權讀取非常相近,唯一的區別就是授權讀取只允許讀取已經被提交的數據
    • 可重復讀取(Repeatable Read), 簡單來說就是保證在事務處理過程中,多次讀取同一數據時,其值都和事務開始時刻是一致的。因此該事務級別禁止了不可重復讀取和臟讀取,但有可能出現幻影數據。
    • 串行化:最嚴格的事務隔離級別。要求所有事務都被串行執行,不能並發執行。

  技術分享

  • 顯然,事務隔離級別越高,就越能保證數據的完整性和一致性,但同時對並發性能的影響越大

臟讀、幻讀、不可重復讀取

  • 臟讀:一個事務讀取到了另一事務還未提交的數據。eg:事務T1 更新了記錄,但未提交,T2 讀取了更新後的行,然後T1 回滾,此時T2 讀取無效。
    事務1:更新一條數據
    ------------->事務2:讀取事務1更新的記錄
    事務1:調用commit進行提交
  • 不可重復讀:在同一事務中,兩次讀取數據,得到的內容不同。eg:
    事務1:查詢一條記錄
    -------------->事務2:更新事務1查詢的記錄
    -------------->事務2:調用commit進行提交
    事務1:再次查詢上次的記錄
  • 幻讀:同一事務中,用同樣的操作讀取兩次,得到的記錄數不一樣。
    事務1:查詢表中所有記錄
    -------------->事務2:插入一條記錄
    -------------->事務2:調用commit進行提交
    事務1:再次查詢表中所有記錄

<事務隔離性>