mysql事務是指將數據庫從一種一致性狀態轉到另一種一致性狀態
mysql事務具有ACID特性:
原子性(Atomicity):事務中的所有操作,要么全部執行,要么都不執行
一致性(Consistency):事務開始和結束后,數據庫的完整性不會被破壞
隔離性(Isolation):事務之間互不影響。事務的隔離級別有四種:讀未提交、讀已提交、可重復讀(默認隔離級別)、串行化
持久性(Durability):事務提交后,對數據的修改是永久性的,即使系統故障也不會丟失
mysql事務的隔離級別
讀未提交(read uncommited):即事務對數據庫數據所做的修改,在事務未提交之前,可以被其他事務看到。A事務對數據庫數據做的修改,在A事務未提交時,事務B可讀到A事務對數據所做的修改。
容易產生的問題:臟讀。由於事務B可讀到事務A所做的修改,但是A並沒有提交,如果事務A執行過程中發生異常回滾,則會導致事務B讀到的是錯誤數據,即臟數據
讀已提交(read commited):A、B兩個數據同時對數據庫中同一條數據做修改,A事務開啟,讀取數據,此時,B事務也開啟,讀取數據,並對數據做出修改,然后提交,此時事務A繼續執行,執行完后,再次讀取數據,發現兩次讀取的結果不一樣,由此產生不可重復讀的問題。
可重復讀(repeatable read):A事務讀取數據庫數據,在處理業務的過程中事務B讀取數據並修改完成后,事務A再次讀取數據時,所得結果和之前讀取的數據一致,並且事務A提交后,不會損害數據的一致性。原理是mysql使用了MVCC的版本控制機制,讀事物開始時,系統會給當前讀事物一個版本號,讀事物后續讀取的版本號都會<=當前版本號,導致當前的讀事物無法讀取到數據的最新版本(這里要說明一下,如果在B事物修改數據后A再修改數據並重新讀取數據,是可以讀取到最新的數據的)。可能產生的問題:幻讀。如:事務A開啟,讀取用戶x的age為15,B事務開啟age讀取用戶x的age並加1,此時用戶x的age為16,A事務再次讀取用戶x的信息發現age還是15,A事物將x用戶的age+1,提交后,發現x用戶的age值為17.從用戶的角度來看,數據的一致性並沒有被破壞,但A事務可能將讀取到的數據15返回給用戶,導致幻讀。
串行化(serializable):表上的一個事務開啟后,在該事務提交之前,其他事務不能對表中的數據做任何修改。該隔離級別會鎖表。