Spring 事務(wù)機(jī)制詳解

Spring事務(wù)機(jī)制主要包括聲明式事務(wù)和編程式事務(wù)

Spring聲明式事務(wù)時(shí),有一個(gè)非常重要的概念就是事務(wù)屬性。事務(wù)屬性通常由事務(wù)的傳播行為,事務(wù)的隔離級(jí)別,事務(wù)的超時(shí)值和事務(wù)只讀標(biāo)志組成。

Spring在TransactionDefinition接口中定義這些屬性,以供PlatfromTransactionManager使用, PlatfromTransactionManager是spring事務(wù)管理的核心接口。

public interface TransactionDefinition {?

? ?int getPropagationBehavior();//返回事務(wù)的傳播行為。?

? ?int getIsolationLevel();//返回事務(wù)的隔離級(jí)別,事務(wù)管理器根據(jù)它來(lái)控制另外一個(gè)事務(wù)可以? ? ?看到本事務(wù)內(nèi)的哪些數(shù)據(jù)。?

? ?int getTimeout();//返回事務(wù)必須在多少秒內(nèi)完成。?

? ?boolean isReadOnly();//事務(wù)是否只讀,事務(wù)管理器能夠根據(jù)這個(gè)返回值進(jìn)行優(yōu)化,確保事? ? ?務(wù)是只讀的。?

}

1. TransactionDefinition接口中定義五個(gè)隔離級(jí)別:

ISOLATION_DEFAULT 這是一個(gè)PlatfromTransactionManager默認(rèn)的隔離級(jí)別,使用數(shù)據(jù)庫(kù)默認(rèn)的事務(wù)隔離級(jí)別.另外四個(gè)與JDBC的隔離級(jí)別相對(duì)應(yīng);

ISOLATION_READ_UNCOMMITTED 這是事務(wù)最低的隔離級(jí)別,它充許別外一個(gè)事務(wù)可以看到這個(gè)事務(wù)未提交的數(shù)據(jù)。這種隔離級(jí)別會(huì)產(chǎn)生臟讀,不可重復(fù)讀和幻像讀。

ISOLATION_READ_COMMITTED? 保證事務(wù)A提交后 事務(wù)B才可以讀取。這種事務(wù)隔離級(jí)別可以避免臟讀出現(xiàn),但是可能會(huì)出現(xiàn)不可重復(fù)讀和幻像讀。

ISOLATION_REPEATABLE_READ? 這種事務(wù)隔離級(jí)別可以防止臟讀,不可重復(fù)讀。但是可能出現(xiàn)幻像讀。

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

名詞解釋?zhuān)?/p>

Dirty reads(臟讀): 事務(wù)B讀了事務(wù)A還沒(méi)有提交的數(shù)據(jù) 然而事務(wù)A失敗了

?non-repeatable reads(數(shù)據(jù)不可重復(fù)讀):事務(wù)A前后兩次讀取數(shù)據(jù)之間事務(wù)B修改了此數(shù)據(jù),導(dǎo)致兩次讀取不一致。?

?phantom reads(幻象讀數(shù)據(jù)):事務(wù)A前后兩次讀取數(shù)據(jù)集之間事務(wù)B改變了此數(shù)據(jù)集條件字段的值 導(dǎo)致取出的數(shù)據(jù)不一致。

2. 在TransactionDefinition接口中定義了七個(gè)事務(wù)傳播行為:

(1)PROPAGATION_REQUIRED 如果存在一個(gè)事務(wù),則支持當(dāng)前事務(wù)。如果沒(méi)有事務(wù)則開(kāi)啟一個(gè)新的事務(wù)。

(2)PROPAGATION_SUPPORTS 如果存在一個(gè)事務(wù),支持當(dāng)前事務(wù)。如果沒(méi)有事務(wù),則非事務(wù)的執(zhí)行

(3)PROPAGATION_MANDATORY 如果已經(jīng)存在一個(gè)事務(wù),支持當(dāng)前事務(wù)。如果沒(méi)有一個(gè)活動(dòng)的事務(wù),則拋出異常。

(4)PROPAGATION_REQUIRES_NEW 總是開(kāi)啟一個(gè)新的事務(wù)。如果一個(gè)事務(wù)已經(jīng)存在,則將這個(gè)存在的事務(wù)掛起。

(5)PROPAGATION_NOT_SUPPORTED? 總是非事務(wù)地執(zhí)行,并掛起任何存在的事務(wù)。

(6)PROPAGATION_NEVER 總是非事務(wù)地執(zhí)行,如果存在一個(gè)活動(dòng)事務(wù),則拋出異常;

(7)PROPAGATION_NESTED如果一個(gè)活動(dòng)的事務(wù)存在,則運(yùn)行在一個(gè)嵌套的事務(wù)中. 如果沒(méi)有活動(dòng)事務(wù), 則按TransactionDefinition.PROPAGATION_REQUIRED 屬性執(zhí)行?!哆@是一個(gè)嵌套事務(wù),使用JDBC 3.0驅(qū)動(dòng)時(shí),僅僅支持DataSourceTransactionManager作為事務(wù)管理器。需要JDBC 驅(qū)動(dòng)的java.sql.Savepoint類(lèi)。有一些JTA的事務(wù)管理器實(shí)現(xiàn)可能也提供了同樣的功能。使用PROPAGATION_NESTED,還需要把PlatformTransactionManager的nestedTransactionAllowed屬性設(shè)為true;而nestedTransactionAllowed屬性值默認(rèn)為false;》

嵌套事務(wù)一個(gè)非常重要的概念就是內(nèi)層事務(wù)依賴(lài)于外層事務(wù)。外層事務(wù)失敗時(shí),會(huì)回滾內(nèi)層事務(wù)所做的動(dòng)作。而內(nèi)層事務(wù)操作失敗并不會(huì)引起外層事務(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Spring事務(wù)機(jī)制主要包括聲明式事務(wù)和編程式事務(wù),此處側(cè)重講解聲明式事務(wù),編程式事務(wù)在實(shí)際開(kāi)發(fā)中得不到廣泛使用,...
    七寸知架構(gòu)閱讀 3,722評(píng)論 1 53
  • Spring 事務(wù)屬性分析 事務(wù)管理對(duì)于企業(yè)應(yīng)用而言至關(guān)重要。它保證了用戶(hù)的每一次操作都是可靠的,即便出現(xiàn)了異常的...
    壹點(diǎn)零閱讀 1,378評(píng)論 0 2
  • Spring事務(wù)機(jī)制主要包括聲明式事務(wù)和編程式事務(wù),此處側(cè)重講解聲明式事務(wù),編程式事務(wù)在實(shí)際開(kāi)發(fā)中得不到廣泛使用,...
    EnigmaXXX閱讀 707評(píng)論 0 0
  • 很多人喜歡這篇文章,特此同步過(guò)來(lái) 由淺入深談?wù)搒pring事務(wù) 前言 這篇其實(shí)也要?dú)w納到《常識(shí)》系列中,但這重點(diǎn)又...
    碼農(nóng)戲碼閱讀 4,904評(píng)論 2 59
  • 7:30,鬧鈴響了 9:20,醒了… 9:40,起床… 滿(mǎn)腦子,都是論文的架構(gòu)。 昨晚臨睡看的青春片并沒(méi)有沖掉我的...
    霡霂淺墨閱讀 272評(píng)論 0 0

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