事務的概念:單一邏輯工作單元執行的一系列操作,要麼完全執行,要麼完全不執行。簡單理解就是每執行一次資料操作都是在事務這個邏輯工作單元中執行的。
事務的四個屬性:ACID。
A:atomic,原子性。原子性強調的是不可分割,將執行資料庫的過程抽象化為實體對象,那這個物件要麼存在要麼不存在,執行時,要麼整個過程執行完畢,要麼不執行。
這樣的優勢,確保資料的完整性,正確性,最真實的實例就是同一張銀行卡在轉帳的過程中突然斷點,事務無法執行完畢,回滾後保證資料在原有的狀態,這樣自己卡內餘額不會減少。
C:Consistent,一致性。一致性和原子性的理解基本上是一致的,都是為了確保資料的完整性,例如,一個事務是由增刪改查4種操作組成,只有四個操作都執行成功的情況下,才能保持成功的狀態,只要有一個操作執行不成功就是失敗狀態,保證狀態的統一。
I:Insulation,隔離性。隔離性針對並發事務存在的,任何事務之間相互隔離,互不影響。高隔離性情況下,一個事務存取另一個事務要么是訪問該事務執行之前的狀態,要么是執行完成之後的狀態,不會訪問第一個事務執行之間的狀態,但這樣導致資料的並發性降低,所有在設計資料庫的時候要根據實際要求,權衡事務的隔離等級。
事務的隔離性由淺入深可分為:READ UNCOMMITTED(未提交讀取)---READ COMMITTED(提交讀取)---REPEATABLE READ(可重複讀取)- --SERIALIZABLE(序列化)
(1)SERIALIZABLE(序列化)
新增範圍鎖定(如表鎖,頁鎖等,關於range lock,我也沒有很深入的研究),直到transaction A結束。以此阻止其它trasaction B對此範圍內的insert,update等操作。
幻讀,髒讀,不可重複讀等問題都不會發生。
(2)REPEATABLE READ(可重複讀取)
讀取的記錄,新增共享鎖定直到transaction A結束。其它transaction B對這個記錄的試圖修改會一直等待直到trasaction A結束。
可能發生的問題:執行範圍查詢時,執行範圍查詢可能會發生。
(3)READ COMMITTED(提交讀取)
在trasaction A讀取資料時對記錄新增共用鎖定,但讀取結束立即釋放。其它transaction B對這個記錄的試圖修改會一直等待直到A中的讀取過程結束,而不需要整個trasaction A的結束。所以,在trasaction A的不同階段對相同記錄的讀取結果可能是不同的。 、
可能發生的問題:無法重複讀取。
(4)READ UNCOMMITTED(未提交讀取)
不新增共享鎖定。所以其它trasaction B可以在trasaction A對記錄的讀取過程中修改同一記錄,可能會導致A讀取的資料是一個被破壞的或說不完整不正確的資料。
另外,在trasaction A中可以讀取到trasaction B(未提交)中修改的資料。例如trasaction B對R記錄修改了,但未提交。此時,在Trasaction A中讀取R記錄,讀出的是被B修改過的資料。
可能發生的問題:髒讀取。
D:Duration,持久性。交易執行完成後,對資料的影響是持久的,即使在這之後系統出現致命故障。
以上是MYSQL 資料庫事務再認識 的內容,更多相關內容請關注PHP中文網站(m.sbmmt.com)!