什么是事務(wù)、事務(wù)特性、事務(wù)隔離級(jí)別、spring事務(wù)傳播特性

1.什么是事務(wù):

事務(wù)是程序中一系列嚴(yán)密的操作,所有操作執(zhí)行必須成功完成,否則在每個(gè)操作所做的更改將會(huì)被撤銷,這也是事務(wù)的原子性(要么成功,要么失?。?/span>

2.事務(wù)特性:

事務(wù)特性分為四個(gè):原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持續(xù)性(Durability)簡(jiǎn)稱ACID。

  1. 原子性(Atomicity):事務(wù)是數(shù)據(jù)庫(kù)邏輯工作單元,事務(wù)中包含的操作要么都執(zhí)行成功,要么都執(zhí)行失敗。

  2. 一致性(Consistency):事務(wù)執(zhí)行的結(jié)果必須是使數(shù)據(jù)庫(kù)數(shù)據(jù)從一個(gè)一致性狀態(tài)變到另外一種一致性狀態(tài)。當(dāng)事務(wù)執(zhí)行成功后就說(shuō)數(shù)據(jù)庫(kù)處于一致性狀態(tài)。如果在執(zhí)行過(guò)程中發(fā)生錯(cuò)誤,這些未完成事務(wù)對(duì)數(shù)據(jù)庫(kù)所做的修改有一部分已寫入物理數(shù)據(jù)庫(kù),這是數(shù)據(jù)庫(kù)就處于不一致狀態(tài)。


  3. 隔離性(Isolation):一個(gè)事務(wù)的執(zhí)行過(guò)程中不能影響到其他事務(wù)的執(zhí)行,即一個(gè)事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對(duì)其他事務(wù)是隔離的,并發(fā)執(zhí)行各個(gè)事務(wù)之間無(wú)不干擾。


  4. 持續(xù)性(Durability):即一個(gè)事務(wù)執(zhí)一旦提交,它對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)的改變是永久性的。之后的其它操作不應(yīng)該對(duì)其執(zhí)行結(jié)果有任何影響。

3.事務(wù)的隔離級(jí)別:

事務(wù)的隔離級(jí)別也分為四種,由低到高依次分別為:read uncommited(讀未提交)、read commited(讀提交)、read repeatable(讀重復(fù))、serializable(序列化),這四個(gè)級(jí)別可以逐個(gè)解決臟讀、不可重復(fù)讀、幻讀這幾類問(wèn)題。

  1. read uncommited:是最低的事務(wù)隔離級(jí)別,它允許另外一個(gè)事務(wù)可以看到這個(gè)事務(wù)未提交的數(shù)據(jù)。


  2. read commited:保證一個(gè)事物提交后才能被另外一個(gè)事務(wù)讀取。另外一個(gè)事務(wù)不能讀取該事物未提交的數(shù)據(jù)。


  3. repeatable read:這種事務(wù)隔離級(jí)別可以防止臟讀,不可重復(fù)讀。但是可能會(huì)出現(xiàn)幻象讀。它除了保證一個(gè)事務(wù)不能被另外一個(gè)事務(wù)讀取未提交的數(shù)據(jù)之外還避免了以下情況產(chǎn)生(不可重復(fù)讀)。


  4. serializable:這是花費(fèi)最高代價(jià)但最可靠的事務(wù)隔離級(jí)別。事務(wù)被處理為順序執(zhí)行。除了防止臟讀,不可重復(fù)讀之外,還避免了幻象讀。


  5. 臟讀、不可重復(fù)讀、幻象讀概念說(shuō)明:


臟讀:指當(dāng)一個(gè)事務(wù)正字訪問(wèn)數(shù)據(jù),并且對(duì)數(shù)據(jù)進(jìn)行了修改,而這種數(shù)據(jù)還沒(méi)有提交到數(shù)據(jù)庫(kù)中,這時(shí),另外一個(gè)事務(wù)也訪問(wèn)這個(gè)數(shù)據(jù),然后使用了這個(gè)數(shù)據(jù)。因?yàn)檫@個(gè)數(shù)據(jù)還沒(méi)有提交那么另外一個(gè)事務(wù)讀取到的這個(gè)數(shù)據(jù)我們稱之為臟數(shù)據(jù)。依據(jù)臟數(shù)據(jù)所做的操作肯能是不正確的。


不可重復(fù)讀:指在一個(gè)事務(wù)內(nèi),多次讀同一數(shù)據(jù)。在這個(gè)事務(wù)還沒(méi)有執(zhí)行結(jié)束,另外一個(gè)事務(wù)也訪問(wèn)該同一數(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 語(yǔ)句會(huì)出現(xiàn)不同的結(jié)果,第二次讀會(huì)增加一數(shù)據(jù)行,并沒(méi)有說(shuō)這兩次執(zhí)行是在同一個(gè)事務(wù)中)

spring事務(wù)傳播特性:

事務(wù)傳播行為就是多個(gè)事務(wù)方法相互調(diào)用時(shí),事務(wù)如何在這些方法間傳播。spring支持7種事務(wù)傳播行為:

propagation_requierd:如果當(dāng)前沒(méi)有事務(wù),就新建一個(gè)事務(wù),如果已存在一個(gè)事務(wù)中,加入到這個(gè)事務(wù)中,這是最常見的選擇。


propagation_supports:支持當(dāng)前事務(wù),如果沒(méi)有當(dāng)前事務(wù),就以非事務(wù)方法執(zhí)行。


propagation_mandatory:使用當(dāng)前事務(wù),如果沒(méi)有當(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)前沒(méi)有事務(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è)方法通過(guò) Spring 的事務(wù)傳播機(jī)制都工作在同一個(gè)事務(wù)中。

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

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

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