1、原子性(atomicity):事務一旦開始,那麼我們只能有兩個結果,要麼全部執行完成,要麼全部都不做,不能停滯在事務中途。如果在執行**錯,必須把事務回滾到事務開始前。
2、一致性(consistency):事務開始前和結束後,資料庫的完整性約束沒有被破壞 。比如買東西,付款的時候,我扣錢成功了,對方也一定要收到錢,不能出現我扣了錢,對方卻沒收到。
3、隔離性(isolation):同一時間,只允許乙個事務請求同一資料,不同的事務之間彼此沒有任何干擾。比如a正在從一張銀行卡中取錢,在a取錢的過程結束前,b不能向這張卡轉賬。
4、永續性(durability):事務一旦完成,那必須儲存到資料庫,並且不能回滾。
首先我們搞懂這幾個由於併發訪問導致的資料讀取問題
1、髒讀(讀取到了執行中未提交的資料)
事務a讀取到了事務b尚未提交的資料,如果事務b回滾了操作,那麼事務a就是讀到了髒資料。
這種情況主要發生在查詢數庫時的併發問題
例如:
這個場景就讀取到了未提交的髒資料了,產生了髒讀
時間軸查詢事務
新增事務
1開始查詢
開始修改
2查詢到資料為100
修改資料為100
3返回查詢資料100
操作發生未知錯誤事務回滾
4提交事務
資料回滾成修改前資料
2、不可重複讀(事務執行中多次讀取,資料內容不一致)
事務a在讀取資料時,由於整個事務a操作比較多,事務需要多次讀取同一條資料時,間隔需要比較長的時間 。事務a在第一次讀取資料,比如讀取到年齡為15歲,事務b執行更改操作,將年齡更改為25歲,此時事務a第二次讀取到年齡時,發現其年齡是25歲,和之前的資料不一樣了,也就是資料不重複了,從而導致了不可重複讀。
例如:
這個場景事務a前後兩次讀取到的資料不一致導致不可重複讀
時間軸事務a
修改事務
1開始事務
2第一次查詢到a年齡為15
3開始事務
4其它操作
5更改a年齡為25
6提交事務
7第二次查詢到a年齡為25
3、幻讀(事務執行中多次讀取,資料總量不一致)
事務a在讀取資料時,由於整個事務a操作比較多,事務需要多次統計資料的總量,間隔需要比較長的時間 。第一次查詢資料總量後,此時事務b執行了新增資料的操作並提交後,這個時候事務a第二次讀取的資料總量和第一次統計的不一樣,多了幾條資料,成為幻讀。
例如:
這個場景事務a前後兩次讀取到的資料總量不一致導致幻讀
時間軸事務a
批量新增事務
1開始事務
2第一次查詢,資料總量為100條
3開始事務
4其它操作
5新增100條資料
6提交事務
7第二次查詢,資料總量為200條
小結:不可重複讀的和幻讀很容易混淆,不可重複讀側重於修改,幻讀側重於新增或刪除。
上面我們說了會存在事務的併發問題,那麼接下來看一看,mysql給我們提供的事務隔離級別分別解決了什麼問題
mysql定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低階別的隔離級一般支援更高的併發處理,並擁有更低的系統開銷。
1、讀未提交(read-uncommitted)
在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,因為它的效能也不比其他級別好多少。讀取未提交的資料,也被稱之為髒讀。
2、不可重複讀(read-committed)
事務中只能看到已經提交事務的資料,這種隔離級別不支援不可重複讀,如果有其它事務正在處理新增並且提交了,查詢前後資料不一致導致不可重複讀
3、可重複讀(repeatable-read)
mysql的預設的事務隔離級別(簡稱:rr),它確保同一事務的多個例項在併發讀取資料時,會看到同樣的資料行。不過還是沒有解決幻讀的問題。後面我們會分享關於innodb儲存引擎通過多版本併發控制(multiversion concurrency control 簡稱mvcc)機制解決了該問題。
4、序列化(serializable)
這是最高的隔離級別,它通過強制事務排序,使之不可能相互衝突,解決所有併發問題。由於犧牲了併發能力,而且非常占用資源,實際開發中不會選擇該級別的事務隔離。
不同事務隔離級別分別解決的併發問題參照表:
事務隔離級別
髒讀不可重複讀
幻讀讀未提交(read-uncommitted)是是
是不可重複讀(read-committed)否是
是可重複讀(repeatable-read)否否
是序列化(serializable)否否
否
MySQL事務及事務隔離級別
原子性 atomicity 事務是乙個原子操作單元,其對資料的修改,要麼全都執行,要麼全都不執行。一致性 consistent 在事務開始和完成時,資料都必須保持一致狀態。這意味著所有相關的資料規則都必須應用於事務的修改,以保持資料的完整性 事務結束時,所有的內部資料結構 如b樹索引或雙向鍊錶 也都...
事務及事務隔離級別
什麼是事務 事務是訪問資料庫的乙個操作序列,資料庫應用系統通過事務集來完成對資料庫的訪問。事務的正確執行使得資料庫從一種狀態轉換為另一種狀態。事務必須服從iso iec所制定的acid原則。acid是原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 du...
事務及事務隔離級別
事務是訪問資料庫的乙個操作序列,資料庫應用系統通過事務集來完成對資料庫的訪問。事務的正確執行使得資料庫從一種狀態轉換為另一種狀態。事務必須服從iso iec所制定的acid原則。acid是原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durabili...