1、原子性(atomicity):要麼全部做完,要麼全部不做。
2、一致性(consistency):事務開始前和結束後,資料庫的完整性約束沒有被破壞 。比如a向b轉賬,不可能a扣了錢,b卻沒收到。
3、隔離性(isolation):同時只允許乙個事務請求同一資料。
4、永續性(durability):事務完成後所有更新將被儲存到資料庫,不能回滾。
1、髒讀:事務a更新某資料但未提交,此時事務b查詢該資料後,事務a才提交。事務b查詢到的資料為臟讀資料。
2、不可重複讀:事務a讀取某一資料,此時事務b更新該資料並提交,事務a再次讀取該資料時,資料不一致。
3、幻讀:事務a讀取某一資料表,此時事務b新增資料或刪除該資料表的資料並提交,事務a再次讀取該資料表時,資料不一致。
#不可重複讀的和幻讀很容易混淆,不可重複讀側重於修改,幻讀側重於新增或刪除。解決不可重複讀的問題只需鎖住滿足條件的記錄,解決幻讀需要鎖表或者加範圍鎖。(幻讀是對大範圍的資料而言的併發問題,因為對某一資料的並發行為,新增和刪除資料不是併發問題,只有對它修改才是併發問題)
事務隔離級別
髒讀不可重複讀
幻讀讀未提交(read-uncommitted)是是
是讀已提交(read-committed)否是
是可重複讀(repeatable-read)否否
是序列化(serializable)否否
否是:表示該級別會發生該種併發問題
指定方式:通過使用 isolation 屬性設定,例如:
@transactional(isolation = isolation.read-committed) 不寫裡面的引數就為預設的read-committed
悲觀鎖:假定會發生併發衝突,遮蔽一切可能違反資料完整性的操作。
樂觀鎖:假設不會發生併發衝突,只在提交操作時檢查是否違反資料完整性。(樂觀鎖不能解決髒讀的問題,因為髒讀問題的產生在於資料未提交就被另一事務查詢)
結論:在實際生產環境裡邊,如果併發量不大且不允許髒讀,可以使用悲觀鎖解決併發問題;但如果系統的併發非常大的話,悲觀鎖定會帶來非常大的效能問題,這時候只能接受髒讀,選擇樂觀鎖定的方法。
傳播行為是指,如果在開始當前事務之前,已經存在乙個事務,此時可以指定這個要開始的這個事務的執行行為。
required :(預設)如果當前存在事務,則加入該事務;如果當前沒有事務,則建立乙個新的事務。
supports :如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續執行。
mandatory :如果當前存在事務,則加入該事務;如果當前沒有事務,則丟擲異常。
requires_new :建立乙個新的事務,如果當前存在事務,則把當前事務掛起。
not_supported :以非事務方式執行,如果當前存在事務,則把當前事務掛起。
never :以非事務方式執行,如果當前存在事務,則丟擲異常。
nested :如果當前存在事務,則建立乙個事務作為當前事務的巢狀事務來執行;如果當前沒有事務, 則該取值等價於 required 。
指定方式:通過使用 propagation 屬性設定,例如:
@transactional(propagation = propagation.required) 和隔離級別一樣,不寫就預設為required
MySQL事務的4種特性以及事務隔離級別
事務的基本特性 1 原子性 atomicity 事務開始後所有操作,要麼全部做完,要麼全部不做,不可能停滯在中間環節。事務執行過程中出錯,會回滾到事務開始前的狀態,所有的操作就像沒有發生一樣。也就是說事務是乙個不可分割的整體,就像化學中學過的原子,是物質構成的基本單位。2 一致性 consisten...
mysql 4種事務隔離級別驗證
1.建表 create table test id int 11 not null auto increment,name varchar 255 default null,primary key id engine innodb auto increment 6 default charset u...
mysql隔離級別 MySQL 事務隔離級別
mysql innodb所提供的事務滿足acid的要求,事務是通過事務日誌中的redo log和undo log來實現原子性 undo log 一致性 undo log 永續性 redo log 事務通過鎖機制實現隔離性。1 事務隔離級別與實現read uncommitted 讀未提交 read c...