事務(wù)注解@Transactional 詳解

@Transactional?是聲明式事務(wù)管理 編程中使用的注解

1 .添加位置

1)接口實(shí)現(xiàn)類或接口實(shí)現(xiàn)方法上,而不是接口類中。

2)訪問權(quán)限:public 的方法才起作用。@Transactional 注解應(yīng)該只被應(yīng)用到 public 方法上,這是由 Spring?AOP?的本質(zhì)決定的。

系統(tǒng)設(shè)計(jì):將標(biāo)簽放置在需要進(jìn)行事務(wù)管理的方法上,而不是放在所有接口實(shí)現(xiàn)類上:只讀的接口就不需要事務(wù)管理,由于配置了@Transactional就需要AOP攔截及事務(wù)的處理,可能影響系統(tǒng)性能。

3)錯(cuò)誤使用:

1.接口中A、B兩個(gè)方法,A無@Transactional標(biāo)簽,B有,上層通過A間接調(diào)用B,此時(shí)事務(wù)不生效。

2.接口中異常(運(yùn)行時(shí)異常)被捕獲而沒有被拋出。

? 默認(rèn)配置下,spring 只有在拋出的異常為運(yùn)行時(shí) unchecked 異常時(shí)才回滾該事務(wù),

? 也就是拋出的異常為RuntimeException 的子類(Errors也會(huì)導(dǎo)致事務(wù)回滾),

? 而拋出 checked 異常則不會(huì)導(dǎo)致事務(wù)回滾 ??赏ㄟ^ @Transactional rollbackFor進(jìn)行配置。

3.多線程下事務(wù)管理因?yàn)榫€程不屬于 spring 托管,故線程不能夠默認(rèn)使用 spring?的事務(wù),

? 也不能獲取spring 注入的 bean 。

? 在被 spring 聲明是事務(wù)管理的方法內(nèi)開啟多線程,多線程內(nèi)的方法不被事務(wù)控制。

? 一個(gè)使用了@Transactional 的方法,如果方法內(nèi)包含多線程的使用,方法內(nèi)部出現(xiàn)異常,

? 不會(huì)回滾線程中調(diào)用方法的事務(wù)。

2.聲明式事務(wù)管理實(shí)現(xiàn)方式:

MyBatis 自動(dòng)參與到 spring 事務(wù)管理中,無需額外配置,

只要 org.mybatis.spring.SqlSessionFactoryBean 引用的數(shù)據(jù)源與

DataSourceTransactionManager 引用的數(shù)據(jù)源一致即可,否則事務(wù)管理會(huì)不起作用。

<annotation-driven> 標(biāo)簽的聲明,

是在 Spring 內(nèi)部啟用 @Transactional 來進(jìn)行事務(wù)管理,使用 @Transactional 前需要配置。

事務(wù)的隔離級(jí)別:是指若干個(gè)并發(fā)的事務(wù)之間的隔離程度

1.@Transactional(isolation = Isolation.READ_UNCOMMITTED):讀取未提交數(shù)據(jù)(會(huì)出現(xiàn)臟讀,不可重復(fù)讀) 基本不使用

2.@Transactional(isolation = Isolation.READ_COMMITTED):讀取已提交數(shù)據(jù)(會(huì)出現(xiàn)不可重復(fù)讀和幻讀)

3.@Transactional(isolation = Isolation.REPEATABLE_READ):可重復(fù)讀(會(huì)出現(xiàn)幻讀)

4.@Transactional(isolation = Isolation.SERIALIZABLE):串行化

事務(wù)傳播行為:如果在開始當(dāng)前事務(wù)之前,一個(gè)事務(wù)上下文已經(jīng)存在,此時(shí)有若干選項(xiàng)可以指定一個(gè)事務(wù)性方法的執(zhí)行行為

1. TransactionDefinition.PROPAGATION_REQUIRED:

? 如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒有事務(wù),則創(chuàng)建一個(gè)新的事務(wù)。這是默認(rèn)值。

2. TransactionDefinition.PROPAGATION_REQUIRES_NEW:

? 創(chuàng)建一個(gè)新的事務(wù),如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。

3. TransactionDefinition.PROPAGATION_SUPPORTS:

? 如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒有事務(wù),則以非事務(wù)的方式繼續(xù)運(yùn)行。

4. TransactionDefinition.PROPAGATION_NOT_SUPPORTED:

? 以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。

5. TransactionDefinition.PROPAGATION_NEVER:

? 以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),則拋出異常。

6. TransactionDefinition.PROPAGATION_MANDATORY:

? 如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒有事務(wù),則拋出異常。

7. TransactionDefinition.PROPAGATION_NESTED:

? 如果當(dāng)前存在事務(wù),則創(chuàng)建一個(gè)事務(wù)作為當(dāng)前事務(wù)的嵌套事務(wù)來運(yùn)行;

? 如果當(dāng)前沒有事務(wù),則該取值等價(jià)于TransactionDefinition.PROPAGATION_REQUIRED。

字段說明:

1. value :主要用來指定不同的事務(wù)管理器;

? 主要用來滿足在同一個(gè)系統(tǒng)中,存在不同的事務(wù)管理器。

? 比如在Spring中,聲明了兩種事務(wù)管理器txManager1, txManager2.然后,

? 用戶可以根據(jù)這個(gè)參數(shù)來根據(jù)需要指定特定的txManager.

2. value 適用場(chǎng)景:在一個(gè)系統(tǒng)中,需要訪問多個(gè)數(shù)據(jù)源或者多個(gè)數(shù)據(jù)庫,

? 則必然會(huì)配置多個(gè)事務(wù)管理器的

3. REQUIRED_NEW:內(nèi)部的事務(wù)獨(dú)立運(yùn)行,在各自的作用域中,可以獨(dú)立的回滾或者提交;

? 而外部的事務(wù)將不受內(nèi)部事務(wù)的回滾狀態(tài)影響。

4. ESTED 的事務(wù),基于單一的事務(wù)來管理,提供了多個(gè)保存點(diǎn)。

? 這種多個(gè)保存點(diǎn)的機(jī)制允許內(nèi)部事務(wù)的變更觸發(fā)外部事務(wù)的回滾。

? 而外部事務(wù)在混滾之后,仍能繼續(xù)進(jìn)行事務(wù)處理,即使部分操作已經(jīng)被混滾。

? 由于這個(gè)設(shè)置基于 JDBC 的保存點(diǎn),所以只能工作在 JDB C的機(jī)制。

5. rollbackFor:讓受檢查異?;貪L;即讓本來不應(yīng)該回滾的進(jìn)行回滾操作。

6. noRollbackFor:忽略非檢查異常;即讓本來應(yīng)該回滾的不進(jì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)容

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