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

