在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:支持当前事务,若是当前事务存在,则执行一个嵌套事务,若是当前没有事务,就新建一个事务。
若有错误,欢迎大佬指正!