Spring中的事務管理
1、什么是事務
- 是資料庫操作的最小作業單元,是作為單個邏輯作業單元執行的一系列操作;
- 這些操作作為一個整體一起向系統提交,要么都執行、要么都不執行;
- 事務是一組不可再分割的操作集合(作業邏輯單元)
在Spring中,事務就是將一組業務當做一個業務來執行,要么全部成功,要么全部失敗,不能破壞資料的完整性,
2、事務的特性
- 原子性(Atomicity):事務是一個原子操作,由一系列動作組成,事務的原子性確保動作要么全部完成,要么完全不起作用,
- 一致性(Consistency):一旦事務完成(不管成功還是失敗),系統必須確保它所建模的業務處于一致的狀態,要么全部完成要么全部失敗,事務操作的實際資料不應該被破壞,
- 隔離性(Isolation):可能有許多事務會同時處理相同的資料,因此每個事務都應該與其他事務隔離開來,防止資料損壞,
- 持久性(Durability):一旦事務完成,無論發生什么系統錯誤,它的結果都不應該受到影響,這樣就能從任何系統崩潰中恢復過來,通常情況下,事務的結果被寫到持久化存盤器中,
3、標準配置
要開啟 Spring 的事務處理功能,在 Spring 的組態檔中創建一個 DataSourceTransactionManager 物件:
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<constructor-arg ref="dataSource" />
</bean>
或 Java類使用注解的方式注入:
@Bean
public DataSourceTransactionManager transactionManager() {
return new DataSourceTransactionManager(dataSource());
}
傳入的 DataSource 可以是任何能夠與 Spring 兼容的 JDBC DataSource,包括連接池和通過 JNDI 查找獲得的 DataSource,
注意:為事務管理器指定的 DataSource 必須和用來創建 SqlSessionFactoryBean 的是同一個資料源,否則事務管理器就無法作業了,
4、宣告式事務(交由容器管理事務)
想讓 Spring 參與到容器管理事務的程序中,那么 Spring 應該被設定為使用 JtaTransactionManager 或由容器指定的一個子類作為事務管理器,最簡單的方式是使用 Spring 的事務命名空間:
<tx:jta-transaction-manager />
或使用JtaTransactionManagerFactoryBean:
@Bean
public JtaTransactionManager transactionManager() {
return new JtaTransactionManagerFactoryBean().getObject();
}
方式一:給SqlSessionFactory注入Spring事務管理器ManagedTransactionFactory:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="transactionFactory">
<bean class="org.apache.ibatis.transaction.managed.ManagedTransactionFactory" />
</property>
</bean>
或:
@Bean
public SqlSessionFactory sqlSessionFactory() {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource());
factoryBean.setTransactionFactory(new ManagedTransactionFactory());
return factoryBean.getObject();
}
方式二:結合AOP實作事務的織入(通常使用)
<!--Spring配置宣告式事務-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<constructor-arg ref="dataSource" />
</bean>
<!--基于AOP實作事務織入-->
<!--配置事務通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!--給哪些方法配置事務-->
<!--配置事務的傳播特性: propagation-->
<tx:attributes>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!--配置事務切入點-->
<aop:config>
<aop:pointcut id="txPointCut" expression="execution(* com.spong.mapper.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
</aop:config>
5、Spring中七種Propagation類的事務屬性詳解:
REQUIRED:支持當前事務,如果當前沒有事務,就新建一個事務,這是最常見的也是默認選擇,
SUPPORTS:支持當前事務,如果當前沒有事務,就以非事務方式執行,
MANDATORY:支持當前事務,如果當前沒有事務,就拋出例外,
REQUIRES_NEW:新建事務,如果當前存在事務,把當前事務掛起,
NOT_SUPPORTED:以非事務方式執行操作,如果當前存在事務,就把當前事務掛起,
NEVER:以非事務方式執行,如果當前存在事務,則拋出例外,
NESTED:支持當前事務,如果當前事務存在,則執行一個嵌套事務,如果當前沒有事務,就新建一個事務,
如有錯誤,歡迎大佬指正!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/83187.html
標籤:Java
上一篇:ACM | 演算法 | 快速冪
