spring事物

1、事物屬性

事物屬性主要是通過TransactionDefinition接口實(shí)現(xiàn)定義,主要有事物的隔離級(jí)別,事物的傳播性,事物的超時(shí)時(shí)間,事物是否只讀

1)事物隔離級(jí)別:用來解決并發(fā)事物出現(xiàn)的問題,其使用TransactionDefinition中的靜態(tài)變量來指定:

?????????ISOLATION_DEFAULT:默認(rèn)隔離級(jí)別,即使用底層數(shù)據(jù)庫(kù)默認(rèn)的隔離級(jí)別;

? ? ? ? ?ISOLATION_READ_UNCOMMITTED:未提交讀;

? ? ? ? ?ISOLATION_READ_COMMITTED:提交讀,一般情況下我們使用這個(gè);

? ? ? ? ?ISOLATION_REPEATABLE_READ:可重復(fù)讀;

? ? ? ? ?ISOLATION_SERIALIZABLE:序列化。

可以使用DefaultTransactionDefinition類中的setIsolationLevel方法來設(shè)計(jì)事物的隔離級(jí)別

2)事物傳播行為:spring管理的事物是邏輯事物,物理事物與邏輯事物兩者之間的區(qū)別就在于事物的傳播行為,事物的傳播行為指用于多個(gè)事物之間調(diào)用,事物是如何在這些方法間傳播的,spring一共支持7中傳播行為:

userDao.save(user);??

?user.getAddress().setUserId(user.getId());??

?addressService.save(user.getAddress());

Required:必須有邏輯事物,否則創(chuàng)建一個(gè)新事物PROPAGATION_REQUIRED指定,表示當(dāng)前如果有事物,則加入該事物,否則創(chuàng)建一個(gè)新事物


? ? 一.當(dāng)userService調(diào)用save()方法時(shí),此時(shí)spring用的required傳播行為并且spring事物管理器中沒有開啟邏輯事物,所以spring管理器會(huì)開啟一個(gè)邏輯事物;

? ? 二.當(dāng)addressService調(diào)用save()方法時(shí)發(fā)現(xiàn)同樣用的required傳播行為,因此使用已經(jīng)存在的邏輯事物

? ??三、在返回到addressService對(duì)象的save方法,當(dāng)事務(wù)模板類執(zhí)行完畢,此時(shí)提交并關(guān)閉事務(wù)。

?????? 因此userService對(duì)象的save方法和addressService的save方法屬于同一個(gè)物理事務(wù),如果發(fā)生回滾,則兩者都回滾

RequiresNew:創(chuàng)建新的邏輯事務(wù),使用PROPAGATION_REQUIRES_NEW指定,表示每次都創(chuàng)建新的邏輯事務(wù)(物理事務(wù)也是不同的),如下圖:


該傳播行為執(zhí)行流程(正確提交情況):

一、當(dāng)執(zhí)行userService對(duì)象的save方法時(shí),由于傳播行為是RequiresNew,因此創(chuàng)建一個(gè)新的邏輯事務(wù)(物理事務(wù)也是不同的);

二、當(dāng)執(zhí)行到addressService對(duì)象的save方法時(shí),由于傳播行為是RequiresNew,因此首先暫停上一個(gè)邏輯事務(wù)并創(chuàng)建一個(gè)新的邏輯事務(wù)(物理事務(wù)也是不同的);

三、addressService對(duì)象的save方法執(zhí)行完畢后,提交邏輯事務(wù)(并提交物理事務(wù))并重新恢復(fù)上一個(gè)邏輯事務(wù),繼續(xù)執(zhí)行userService對(duì)象的save方法內(nèi)的操作;

四、最后userService對(duì)象的save方法執(zhí)行完畢,提交邏輯事務(wù)(并提交物理事務(wù));

五、userService對(duì)象的save方法和addressService對(duì)象的save方法不屬于同一個(gè)邏輯事務(wù)且也不屬于同一個(gè)物理事務(wù)。

Supports:支持當(dāng)前事物,使用PROPAGATION_SUPPORTS指定,如果當(dāng)前存在邏輯事物,則加入當(dāng)前邏輯事物,如果沒有,則以非事物方式提交


NotSupported:不支持事物,如果當(dāng)前存在事物則暫停該事物,使用PROPAGATION_NOT_SUPPORTED指定,以非事物方式執(zhí)行,如果當(dāng)前存在邏輯事務(wù),就把當(dāng)前事務(wù)暫停,以非事務(wù)方式執(zhí)行。


Mandatory:必須有事物,否則拋出異常,使用PROPAGATION_MANDATORY指定,使用當(dāng)前事物執(zhí)行,如果當(dāng)前沒有事物,則拋出異常。


Never:不支持事物,如果當(dāng)前有事物則拋出異常,使用PROPAGATION_NEVER指定,即以非事物方式執(zhí)行,如果當(dāng)前存在事物,則拋出異常。

Nested:嵌套事物支持,使用PROPAGATION_NESTED指定,如果當(dāng)前存在事物,則嵌套在事物內(nèi)執(zhí)行,如果當(dāng)前沒有事物,則創(chuàng)建一個(gè)新事物執(zhí)行,嵌套事物是以數(shù)據(jù)庫(kù)保存點(diǎn)來實(shí)現(xiàn),即嵌套事物回滾不會(huì)影響外部事物,但外部事物回滾會(huì)影響嵌套事物。

Nested和RequiresNew的區(qū)別:

1.RequiredNew每次都是創(chuàng)建一個(gè)新的獨(dú)立的物理事物,而Nested只有一個(gè)物理事物

2.Nested嵌套事物發(fā)生回滾不會(huì)影響外部事物,外部事物發(fā)生回滾會(huì)影響嵌套事物,而RequiredNew每次創(chuàng)建的都是新事物,所以并沒有關(guān)聯(lián)。

3.Nested使用JDBC 3的保存點(diǎn)實(shí)現(xiàn),即如果使用低版本驅(qū)動(dòng)將導(dǎo)致不支持嵌套事務(wù)。

使用嵌套事務(wù),必須確保具體事務(wù)管理器實(shí)現(xiàn)的nestedTransactionAllowed屬性為true,否則不支持嵌套事務(wù),如DataSourceTransactionManager默認(rèn)支持,而HibernateTransactionManager默認(rèn)不支持,需要我們來開啟。

?著作權(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)容

  • 背景 Spring 默認(rèn)的事務(wù)的傳播為PROPAGATION_REQUIRED即如果當(dāng)前沒有事務(wù),就新建一個(gè)事務(wù)。...
    shawnxjf閱讀 1,214評(píng)論 0 5
  • 看到關(guān)于spring事物比較好的兩篇文章,轉(zhuǎn)載過來。 1.事務(wù)的定義:事務(wù)是指多個(gè)操作單元組成的合集,多個(gè)單元操作...
    Aldeo閱讀 1,031評(píng)論 0 8
  • 事物特性 ⑴原子性(Atomicity) 原子性是指事務(wù)包含的所有操作要么全部成功,要么全部失敗回滾,因此事務(wù)的操...
    HJJ_3c00閱讀 303評(píng)論 0 0
  • 很多人喜歡這篇文章,特此同步過來 由淺入深談?wù)搒pring事務(wù) 前言 這篇其實(shí)也要?dú)w納到《常識(shí)》系列中,但這重點(diǎn)又...
    碼農(nóng)戲碼閱讀 4,912評(píng)論 2 59
  • 一、spring事物 Spring傳播事務(wù)行為類型 二:REQUIRED和REQUIRES_NEW情況說明 1.方...
    吳世浩閱讀 964評(píng)論 0 2

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