Spring中@Transactional注解的屬性說明
1 .添加位置
1)接口實現(xiàn)類或接口實現(xiàn)方法上,而不是接口類中。
2)訪問權(quán)限:public 的方法才起作用。@Transactional 注解應(yīng)該只被應(yīng)用到 public 方法上,這是由 Spring AOP 的本質(zhì)決定的。 系統(tǒng)設(shè)計:最好將標(biāo)簽放置在需要進(jìn)行事務(wù)管理的方法上,而不是放在所有接口實現(xiàn)類上:因為只讀的接口就不需要事務(wù)管理,由于配置了@Transactional就需要AOP攔截及事務(wù)的處理,可能影響系統(tǒng)性能。如果想放在實現(xiàn)類上,可以加一個readOnly=true,忽略那些不需要事務(wù)的方法,比如讀取數(shù)據(jù)。
3)錯誤使用:
1.接口中A、B兩個方法,A無@Transactional標(biāo)簽,B有,上層通過A間接調(diào)用B,此時事務(wù)不生效。
2.接口中異常(運行時異常)被捕獲而沒有被拋出。
默認(rèn)配置下,spring 只有在拋出的異常為運行時 unchecked 異常時才回滾該事務(wù),
也就是拋出的異常為RuntimeException 的子類(Errors也會導(dǎo)致事務(wù)回滾),而拋出 checked 異常則不會導(dǎo)致事務(wù)回滾 ??赏ㄟ^ @Transactional rollbackFor進(jìn)行配置。
3.多線程下事務(wù)管理因為線程不屬于 spring 托管,故線程不能夠默認(rèn)使用 spring 的事務(wù), 也不能獲取spring 注入的 bean 。
在被 spring 聲明式事務(wù)管理的方法內(nèi)開啟多線程,多線程內(nèi)的方法不被事務(wù)控制。
一個使用了@Transactional 的方法,如果方法內(nèi)包含多線程的使用,方法內(nèi)部出現(xiàn)異常, 不會回滾線程中調(diào)用方法的事務(wù)。
2.聲明式事務(wù)管理實現(xiàn)方式
基于 tx 和 aop 名字空間的 xml 配置文件 // 基本配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:task="http://www.springframework.org/schema/task" xmlns:jms="http://www.springframework.org/schema/jms" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-4.1.xsd"> <bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="shardingDataSource"></property> </bean> <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" /> // MyBatis 自動參與到 spring 事務(wù)管理中,無需額外配置, 只要 org.mybatis.spring.SqlSessionFactoryBean 引用的數(shù)據(jù)源與 DataSourceTransactionManager 引用的數(shù)據(jù)源一致即可,否則事務(wù)管理會不起作用。 // <annotation-driven> 標(biāo)簽的聲明, 是在 Spring 內(nèi)部啟用 @Transactional 來進(jìn)行事務(wù)管理,使用 @Transactional 前需要配置。
3. @Transactional注解
@Transactional 實質(zhì)是使用了 JDBC 的事務(wù)來進(jìn)行事務(wù)控制的 @Transactional 基于 Spring 的動態(tài)代理的機制
@Transactional 實現(xiàn)原理:
1) 事務(wù)開始時,通過AOP機制,生成一個代理connection對象, 并將其放入 DataSource 實例的某個與 DataSourceTransactionManager 相關(guān)的某處容器中。
在接下來的整個事務(wù)中,客戶代碼都應(yīng)該使用該 connection 連接數(shù)據(jù)庫, 執(zhí)行所有數(shù)據(jù)庫命令。
[不使用該 connection 連接數(shù)據(jù)庫執(zhí)行的數(shù)據(jù)庫命令,在本事務(wù)回滾的時候得不到回滾]
(物理連接 connection 邏輯上新建一個會話session; DataSource 與 TransactionManager 配置相同的數(shù)據(jù)源)
2) 事務(wù)結(jié)束時,回滾在第1步驟中得到的代理 connection 對象上執(zhí)行的數(shù)據(jù)庫命令,然后關(guān)閉該代理 connection 對象。
(事務(wù)結(jié)束后,回滾操作不會對已執(zhí)行完畢的SQL操作命令起作用)
4. @Transactional 注解的屬性介紹
下面分別介紹一下 @Transactional 的幾個屬性。
value 和 transactionManager 屬性 它們兩個是一樣的意思。當(dāng)配置了多個事務(wù)管理器時,可以使用該屬性指定選擇哪個事務(wù)管理器。
propagation 屬性 事務(wù)的傳播行為,默認(rèn)值為 Propagation.REQUIRED。
可選的值有:
- Propagation.REQUIRED 如果當(dāng)前存在事務(wù),則加入該事務(wù),如果當(dāng)前不存在事務(wù),則創(chuàng)建一個新的事務(wù)。
- Propagation.SUPPORTS 如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前不存在事務(wù),則以非事務(wù)的方式繼續(xù)運行。
- Propagation.MANDATORY 如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前不存在事務(wù),則拋出異常。
- Propagation.REQUIRES_NEW 重新創(chuàng)建一個新的事務(wù),如果當(dāng)前存在事務(wù),暫停當(dāng)前的事務(wù)。
- Propagation.NOT_SUPPORTED 以非事務(wù)的方式運行,如果當(dāng)前存在事務(wù),暫停當(dāng)前的事務(wù)。
- Propagation.NEVER 以非事務(wù)的方式運行,如果當(dāng)前存在事務(wù),則拋出異常。
- Propagation.NESTED 和 Propagation.REQUIRED 效果一樣。
這些概念理解起來實在是有點兒抽象,后文會用代碼示例解釋說明。
isolation 屬性 事務(wù)的隔離級別,默認(rèn)值為 Isolation.DEFAULT。
可選的值有:
- Isolation.DEFAULT
使用底層數(shù)據(jù)庫默認(rèn)的隔離級別。
Isolation.READ_UNCOMMITTED Isolation.READ_COMMITTED Isolation.REPEATABLE_READ Isolation.SERIALIZABLE timeout 屬性 事務(wù)的超時時間,默認(rèn)值為-1。如果超過該時間限制但事務(wù)還沒有完成,則自動回滾事務(wù)。
- readOnly 屬性 指定事務(wù)是否為只讀事務(wù),默認(rèn)值為 false;為了忽略那些不需要事務(wù)的方法,比如讀取數(shù)據(jù),可以設(shè)置 read-only 為 true。
- rollbackFor 屬性 用于指定能夠觸發(fā)事務(wù)回滾的異常類型,可以指定多個異常類型。
- noRollbackFor 屬性 拋出指定的異常類型,不回滾事務(wù),也可以指定多個異常類型。
5. 注解方式的事務(wù)使用注意事項
正確的設(shè)置@Transactional 的 rollbackFor 屬性 默認(rèn)情況下,如果在事務(wù)中拋出了**未檢查異常(繼承自 RuntimeException 的異常)**或者 Error,則 Spring 將回滾事務(wù);除此之外,Spring 不會回滾事務(wù)。
如果在事務(wù)中拋出其他類型的異常,并期望 Spring 能夠回滾事務(wù),可以指定** rollbackFor**。例:
@Transactional(propagation= Propagation.REQUIRED,rollbackFor= MyException.class)
通過分析 Spring 源碼可以知道,若在目標(biāo)方法中拋出的異常是 rollbackFor 指定的異常的子類,事務(wù)同樣會回滾。
到此這篇關(guān)于Spring中@Transactional注解的屬性說明的文章就介紹到這了,更多相關(guān)@Transactional注解的屬性內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在MyBatis的XML映射文件中<trim>元素所有場景下的完整使用示例代碼
在MyBatis的XML映射文件中,<trim>元素用于動態(tài)添加SQL語句的一部分,處理前綴、后綴及多余的逗號或連接符,示例展示了如何在UPDATE、SELECT、INSERT和SQL片段中使用<trim>元素,以實現(xiàn)動態(tài)的SQL構(gòu)建,感興趣的朋友一起看看吧2025-01-01Java實現(xiàn)用Freemarker完美導(dǎo)出word文檔(帶圖片)
這篇文章主要介紹了Java實現(xiàn)用Freemarker完美導(dǎo)出word文檔(帶圖片),具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07SpringBoot監(jiān)控SQL運行情況的流程步驟
Druid是Java語言中最好的數(shù)據(jù)庫連接池,雖然?HikariCP?的速度稍快,但是,Druid能夠提供強大的監(jiān)控和擴展功能?,也是阿里巴巴的開源項目,本文給大家介紹了SpringBoot監(jiān)控SQL運行情況的流程步驟,需要的朋友可以參考下2024-03-03Android中PreferenceActivity使用詳解
本文主要介紹了Android中PreferenceActivity使用詳解,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09