Spring事務的核心對象 spring提供了三大介面來實現事務的控制 PlatformTransactionManager 此介面定義了事務的基本操作,因為此類是一個介面,所以我們創建事務對象,需要用其實現類DataSourceTransactionManager 方法 說明 DataSour ...
Spring事務的核心對象
spring提供了三大介面來實現事務的控制
-
PlatformTransactionManager
此介面定義了事務的基本操作,因為此類是一個介面,所以我們創建事務對象,需要用其實現類
DataSourceTransactionManager
方法 說明 DataSourceTransactionManager(DataSource dataSource) 構造方法,用於創建事務對象 void commit(TransactionStatus status) 提交事務,需要提供事務的狀態對象作為參數 void rollback(TransactionStatus status) 回歸事務,需要提供事務的狀態對象作為參數 TransactionStatus getTransaction(TransactionDefinition definition) 獲取事務的狀態對象 -
TransactionDefinition
此介面定義了事務的基本信息,包括事務的隔離級別,事務的名稱,超時時間等等;要註意的是如果要創建事務定義對象,需要使用其實現類
DefaultTransactionDefinition
方法 說明 DefaultTransactionDefinition() 構造方法,創建事務定義對象 String getName() 獲取事務定義名稱 boolean isReadOnly() 獲取事務的讀寫屬性 int getIsolationLevel() 獲取事務隔離級別 -
TransactionStatus
事務狀態對象,此介面定義了事務在執行過程中的信息,這個介面的實現類對象通過事務管理獲取
PlatformTransactionManager
方法 說明 PlatformTransactionManager . getTransaction(TransactionDefinition definition) 獲取事務狀態對象 boolean isNewTransaction() 獲取事務是否處於新開啟事務狀態 boolean isCompleted() 獲取事務是否處於回滾狀態 void setRollbackOnly() 設置事務處於回滾狀態
使用Spring核心對象,採用編程式實現事務控制
模擬轉賬業務,也是採用AOP的方法,為原始方法增強業務功能。
-
原始方法
/** * * @param outName 出賬用戶名 * @param inName 入賬用戶名 * @param money 轉賬金額 */ public void transfer(String outName, String inName, Double money) { //執行業務 accountDao.inMoney(outName, money); //模擬報錯 int i = 1 / 0; accountDao.outMoney(inName, money); }
-
環繞通知
public class TxAdvice { //數據源 private DataSource dataSource; public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } /** * 環繞通知 */ public Object transactionManager(ProceedingJoinPoint pjp) throws Throwable { //創建事務 PlatformTransactionManager dt = new DataSourceTransactionManager(dataSource); //創建事務定義對象 TransactionDefinition td = new DefaultTransactionDefinition(); //獲取事務狀態 TransactionStatus ts = dt.getTransaction(td); //調用原始方法 Object result = pjp.proceed(pjp.getArgs()); //提交事務 dt.commit(ts); return result; } }
-
配置aop
<!--配置事務bean--> <bean id="txAdvice" class="com.itheima.aop.TxAdvice"> <property name="dataSource" ref="dataSource"/> </bean> <!--配置aop--> <aop:config> <!--配置切入點--> <aop:pointcut id="pt" expression="execution(* *.*.transfer(..))"/> <!--配置切麵,整合切入點和通知--> <aop:aspect ref="txAdvice"> <!--環繞通知--> <aop:around method="transactionManager" pointcut-ref="pt"/> </aop:aspect> </aop:config>
聲明式事務之XML配置
-
說明
Spring 框架本身已經充分考慮了對事物的支持,所以我們完全不必像之前一樣自定義類來實現對事物的控制。Spring 已經抽象了一整套的事務機制,而作為開發人員根本不必瞭解底層的事務 API,所以我們可以採用 Spring 提供的管理器實現類,來替換掉之前我們自己編寫的事務控制工具類。
-
實現步驟
-
在配置文件中,初始化 Spring 框架提供的事務管理器的實現類。
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!--引用數據源--> <property name="dataSource" ref="dataSource"/> </bean>
-
使用 Spring 提供的事務管理器類作為切麵,在其中配置事務通知。
<!--配置事務通知,transaction-manager:引用事務管理器bean--> <tx:advice id="txAdvice" transaction-manager="txManager"> <!--配置事務屬性--> <tx:attributes> <!--配置所有方法都能讀寫-> <tx:method name="*" read-only="false"/> <!--配置find開頭的方法只能讀--> <tx:method name="find*" read-only="true"/> </tx:attributes> </tx:advice>
-
aop配置,整合切入點與事務通知
<!--配置aop--> <aop:config> <!--配置切入點,指定要攔截的方法--> <aop:pointcut id="pt" expression="execution(* com.itheima.service..*.*(..))"/> <!--整合切入點以及事務通知--> <aop:advisor advice-ref="txAdvice" pointcut-ref="pt"/> </aop:config>
-
<tx:method>
標簽的屬性
<tx:method
name="*"
read-only="false"
timeout="-1"
isolation="DEFAULT"
no-rollback-for=""
rollback-for=""
propagation="REQUIRED"
/>
- name:待添加事務的方法名錶達式(支持號通配符),例如get 、*
- read-only:設置事務的讀寫屬性,true為只讀,false為讀寫。
- timeout:設置事務的超時時長,單位秒
- isolation:設置事務的隔離級別,該隔離級設定是基於Spring的設定,非資料庫端。
- no-rollback-for:設置事務中不回滾的異常,多個異常間使用逗號分割.
- rollback-for:設置事務中的回滾異常,多個異常使用逗號分隔
- propagation:設置事務的傳播行為
聲明式事務之註解配置
註解+XML
-
配置步驟
-
在配置文件中配置組件掃描
<!--配置組件掃描器--> <context:component-scan base-package="com.itheima"/>
-
在配置文件中配置事務管理器
<!--初始化事務管理器--> <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!--引用數據源--> <property name="dataSource" ref="dataSource"/> </bean>
-
在配置文件中開啟事務註解驅動支持
<!-- 開啟事務註解驅動 transaction-manager:引用事務管理器bean --> <tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>
-
使用@Transactional註解
-
作用位置:介面類上,介面方法上。
-
作用:設置當前類/介面中所有方法或具體方法開啟事務,並指定相關事務屬性。
-
屬性
@Transactional( readOnly = false, timeout = -1, isolation = Isolation.DEFAULT, rollbackFor = {ArithmeticException.class, IOException.class}, noRollbackFor = {}, propagation = Propagation.REQUIRES_NEW )
一般不加參數。
-
-
-
使用全註解
-
配置步驟
-
編寫事務管理配置類,將事務管理器存入spring容器
註意:事務管理類要依賴數據源
/** * 配置事務管理器 */ @Bean public DataSourceTransactionManager getTransactionManager(@Autowired DataSource dataSource) { return new DataSourceTransactionManager(dataSource); }
-
-
在spring配置類中開啟事務管理註解驅動
@Configuration @ComponentScan("com.itheima") @Import({JdbcConfig.class, MybatisConfig.class}) //啟用事務管理註解驅動 @EnableTransactionManagement public class SpringConfig { }
註解解釋:
@Configuration
:表示當前類是spring的配置類,當創建spring容器的時候,就使用此類來創建。@ComponentScan
:組件掃描,配置後spring在載入的時候才會根據你配置的掃描包,去包下掃描註解。@Import
:引入其他配置類,存入spring容器中,作為bean。@EnableTransactionManagement
:此註解表示啟用事務管理註解驅動,只有當配置這個註解,spring才會去解析程式中使用的@Transactional
註解
-
在程式的介面/介面方法上使用
@Transactional
註解。設置
@Transactional
註解所在的當前類/介面中,所有方法或具體方法開啟事務,並指定相關事務屬性。
-