在Spring中,事務就是將一組業務當作一個業務來執行,要麼所有成功,要麼所有失敗,不能破壞數據的完整性。java
要開啓 Spring 的事務處理功能,在 Spring 的配置文件中建立一個 DataSourceTransactionManager
對象:spring
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <constructor-arg ref="dataSource" /> </bean>
或 Java類使用註解的方式注入:sql
@Bean public DataSourceTransactionManager transactionManager() { return new DataSourceTransactionManager(dataSource()); }
傳入的 DataSource
能夠是任何可以與 Spring 兼容的 JDBC DataSource
。包括鏈接池和經過 JNDI 查找得到的 DataSource
。數據庫
注意:爲事務管理器指定的 DataSource
必須和用來建立 SqlSessionFactoryBean
的是同一個數據源,不然事務管理器就沒法工做了。express
想讓 Spring 參與到容器管理事務的過程當中,那麼 Spring 應該被設置爲使用 JtaTransactionManager 或由容器指定的一個子類做爲事務管理器。最簡單的方式是使用 Spring 的事務命名空間:apache
<tx:jta-transaction-manager />
或使用JtaTransactionManagerFactoryBean
:session
@Bean public JtaTransactionManager transactionManager() { return new JtaTransactionManagerFactoryBean().getObject(); }
<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>
或:mybatis
@Bean public SqlSessionFactory sqlSessionFactory() { SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); factoryBean.setDataSource(dataSource()); factoryBean.setTransactionFactory(new ManagedTransactionFactory()); return factoryBean.getObject(); }
<!--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>
REQUIRED:支持當前事務,若是當前沒有事務,就新建一個事務。這是最多見的也是默認選擇。app
SUPPORTS:支持當前事務,若是當前沒有事務,就以非事務方式執行。code
MANDATORY:支持當前事務,若是當前沒有事務,就拋出異常。
REQUIRES_NEW:新建事務,若是當前存在事務,把當前事務掛起。
NOT_SUPPORTED:以非事務方式執行操做,若是當前存在事務,就把當前事務掛起。
NEVER:以非事務方式執行,若是當前存在事務,則拋出異常。
NESTED:支持當前事務,若是當前事務存在,則執行一個嵌套事務,若是當前沒有事務,就新建一個事務。
若有錯誤,歡迎大佬指正!