事務

事務

事務是一個并發(fā)控制的單位,是用戶定義的一個操作序列。包含了多個sql操作。

事務特性

原子性:要么都做,要么都不做。
一致性:完成事務后,所有的數(shù)據(jù)必須是一致的,比如轉(zhuǎn)賬。
隔離性:事務之間是隔離操作的。
持久性:事務完成之后,不能再返回原狀態(tài)了。

不隔離時可能發(fā)生的問題

1.臟讀:比如一個事務t1有2條修改數(shù)據(jù)的sql,執(zhí)行完第一條后,事務t2讀取了數(shù)據(jù),然而t1的第二條sql還沒執(zhí)行,導致讀取數(shù)據(jù)不對,這就是臟讀。
2.不可重復讀:事務t1讀取數(shù)據(jù),事務t2修改了數(shù)據(jù),事務t1短時間內(nèi)又讀取,發(fā)現(xiàn)數(shù)據(jù)不同了,這就是不可重復讀。
3.幻讀:事務t1修改了數(shù)據(jù),此時t2事務插入又修改了數(shù)據(jù),導致t1查看數(shù)據(jù)時發(fā)現(xiàn)數(shù)據(jù)不對,這就是幻讀。

事務隔離級別(Mysql)

1.Serializable(串行化):相當于給表上鎖,隔離級別最高,但執(zhí)行效率最低
2.Repeatable Read(可重復讀):可避免臟讀和可重復讀的發(fā)生。
3.Read Commited(讀已提交):避免臟讀。 Mysql的默認級別
4.Read UnCommited(讀未提交):什么都不能避免。

Spring事務傳播

事務傳播(嵌套):在service中一個事務/非事務方法調(diào)用了另一個事務/非事務方法。

前提:方法A調(diào)用了方法B
Required:如果A啟動了事務,則B就不用再啟動事務;如果A沒有啟動事務,則B需要啟動事務。
Supports:如果A啟動了事務,則B不用啟動;如果A不啟動,B也不啟動。
Required_New:新啟動B事務,并將A事務掛起,等到B事務執(zhí)行完再繼續(xù)執(zhí)行,如果B事務失敗了,AB都回滾,如果A失敗B成功,則只有A回滾B不回滾。
Never:B事務直接拋出異常。
Nested:B事務成為A事務的子事務,即”嵌套事務“,B開始執(zhí)行時候獲得一個savepoint,如果B失敗,則A回滾到savepoint的位置,只有A執(zhí)行完成B才會被真正提交。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容