1.什么是事務(wù):
事務(wù)是程序中一系列嚴(yán)密的操作喂柒,所有操作執(zhí)行必須成功完成不瓶,否則在每個(gè)操作所做的更改將會(huì)被撤銷禾嫉,這也是事務(wù)的原子性(要么成功,要么失斘秘ぁ)熙参。
2.事務(wù)特性:
事務(wù)特性分為四個(gè):原子性(Atomicity)、一致性(Consistency)麦备、隔離性(Isolation)孽椰、持續(xù)性(Durability)簡稱ACID。
原子性(Atomicity):事務(wù)是數(shù)據(jù)庫邏輯工作單元凛篙,事務(wù)中包含的操作要么都執(zhí)行成功黍匾,要么都執(zhí)行失敗。
-
一致性(Consistency):事務(wù)執(zhí)行的結(jié)果必須是使數(shù)據(jù)庫數(shù)據(jù)從一個(gè)一致性狀態(tài)變到另外一種一致性狀態(tài)呛梆。當(dāng)事務(wù)執(zhí)行成功后就說數(shù)據(jù)庫處于一致性狀態(tài)锐涯。如果在執(zhí)行過程中發(fā)生錯(cuò)誤,這些未完成事務(wù)對數(shù)據(jù)庫所做的修改有一部分已寫入物理數(shù)據(jù)庫填物,這是數(shù)據(jù)庫就處于不一致狀態(tài)纹腌。
-
隔離性(Isolation):一個(gè)事務(wù)的執(zhí)行過程中不能影響到其他事務(wù)的執(zhí)行,即一個(gè)事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對其他事務(wù)是隔離的融痛,并發(fā)執(zhí)行各個(gè)事務(wù)之間無不干擾壶笼。
持續(xù)性(Durability):即一個(gè)事務(wù)執(zhí)一旦提交,它對數(shù)據(jù)庫數(shù)據(jù)的改變是永久性的雁刷。之后的其它操作不應(yīng)該對其執(zhí)行結(jié)果有任何影響覆劈。
3.事務(wù)的隔離級別:
事務(wù)的隔離級別也分為四種,由低到高依次分別為:read uncommited(讀未提交)沛励、read commited(讀提交)责语、read repeatable(讀重復(fù))、serializable(序列化)目派,這四個(gè)級別可以逐個(gè)解決臟讀坤候、不可重復(fù)讀、幻讀這幾類問題企蹭。
-
read uncommited:是最低的事務(wù)隔離級別白筹,它允許另外一個(gè)事務(wù)可以看到這個(gè)事務(wù)未提交的數(shù)據(jù)。
-
read commited:保證一個(gè)事物提交后才能被另外一個(gè)事務(wù)讀取谅摄。另外一個(gè)事務(wù)不能讀取該事物未提交的數(shù)據(jù)徒河。
-
repeatable read:這種事務(wù)隔離級別可以防止臟讀,不可重復(fù)讀送漠。但是可能會(huì)出現(xiàn)幻象讀顽照。它除了保證一個(gè)事務(wù)不能被另外一個(gè)事務(wù)讀取未提交的數(shù)據(jù)之外還避免了以下情況產(chǎn)生(不可重復(fù)讀)。
-
serializable:這是花費(fèi)最高代價(jià)但最可靠的事務(wù)隔離級別闽寡。事務(wù)被處理為順序執(zhí)行代兵。除了防止臟讀尼酿,不可重復(fù)讀之外,還避免了幻象讀植影。
臟讀裳擎、不可重復(fù)讀、幻象讀概念說明:
臟讀:指當(dāng)一個(gè)事務(wù)正字訪問數(shù)據(jù)何乎,并且對數(shù)據(jù)進(jìn)行了修改句惯,而這種數(shù)據(jù)還沒有提交到數(shù)據(jù)庫中土辩,這時(shí)支救,另外一個(gè)事務(wù)也訪問這個(gè)數(shù)據(jù),然后使用了這個(gè)數(shù)據(jù)拷淘。因?yàn)檫@個(gè)數(shù)據(jù)還沒有提交那么另外一個(gè)事務(wù)讀取到的這個(gè)數(shù)據(jù)我們稱之為臟數(shù)據(jù)各墨。依據(jù)臟數(shù)據(jù)所做的操作肯能是不正確的。
不可重復(fù)讀:指在一個(gè)事務(wù)內(nèi)启涯,多次讀同一數(shù)據(jù)贬堵。在這個(gè)事務(wù)還沒有執(zhí)行結(jié)束,另外一個(gè)事務(wù)也訪問該同一數(shù)據(jù)结洼,那么在第一個(gè)事務(wù)中的兩次讀取數(shù)據(jù)之間黎做,由于第二個(gè)事務(wù)的修改第一個(gè)事務(wù)兩次讀到的數(shù)據(jù)可能是不一樣的,這樣就發(fā)生了在一個(gè)事物內(nèi)兩次連續(xù)讀到的數(shù)據(jù)是不一樣的松忍,這種情況被稱為是不可重復(fù)讀蒸殿。
幻象讀:一個(gè)事務(wù)先后讀取一個(gè)范圍的記錄,但兩次讀取的紀(jì)錄數(shù)不同鸣峭,我們稱之為幻象讀(兩次執(zhí)行同一條 select 語句會(huì)出現(xiàn)不同的結(jié)果宏所,第二次讀會(huì)增加一數(shù)據(jù)行,并沒有說這兩次執(zhí)行是在同一個(gè)事務(wù)中)
spring事務(wù)傳播特性:
事務(wù)傳播行為就是多個(gè)事務(wù)方法相互調(diào)用時(shí)摊溶,事務(wù)如何在這些方法間傳播爬骤。spring支持7種事務(wù)傳播行為:
propagation_requierd:如果當(dāng)前沒有事務(wù),就新建一個(gè)事務(wù)莫换,如果已存在一個(gè)事務(wù)中霞玄,加入到這個(gè)事務(wù)中,這是最常見的選擇拉岁。
propagation_supports:支持當(dāng)前事務(wù)坷剧,如果沒有當(dāng)前事務(wù),就以非事務(wù)方法執(zhí)行膛薛。
propagation_mandatory:使用當(dāng)前事務(wù)听隐,如果沒有當(dāng)前事務(wù),就拋出異常哄啄。
propagation_required_new:新建事務(wù)雅任,如果當(dāng)前存在事務(wù)风范,把當(dāng)前事務(wù)掛起。
propagation_not_supported:以非事務(wù)方式執(zhí)行操作沪么,如果當(dāng)前存在事務(wù)硼婿,就把當(dāng)前事務(wù)掛起。
propagation_never:以非事務(wù)方式執(zhí)行操作禽车,如果當(dāng)前事務(wù)存在則拋出異常寇漫。
propagation_nested:如果當(dāng)前存在事務(wù),則在嵌套事務(wù)內(nèi)執(zhí)行殉摔。如果當(dāng)前沒有事務(wù)州胳,則執(zhí)行與propagation_required類似的操作
Spring 默認(rèn)的事務(wù)傳播行為是 PROPAGATION_REQUIRED,它適合于絕大多數(shù)的情況逸月。假設(shè) ServiveX#methodX() 都工作在事務(wù)環(huán)境下(即都被 Spring 事務(wù)增強(qiáng)了)栓撞,假設(shè)程序中存在如下的調(diào)用鏈:Service1#method1()->Service2#method2()->Service3#method3(),那么這 3 個(gè)服務(wù)類的 3 個(gè)方法通過 Spring 的事務(wù)傳播機(jī)制都工作在同一個(gè)事務(wù)中碗硬。