<事務隔離性>
阿新 • • 發佈:2017-08-06
一個 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:再次查詢表中所有記錄
<事務隔離性>