使用 MyBatis-Spring 的其中一個主要緣由是它容許 MyBatis 參與到 Spring 的事務管理中。spring
而不是給 MyBatis 建立一個新的專用事務管理器,MyBatis-Spring 藉助了 Spring 中的 DataSourceTransactionManager 來實現事務管理。數據庫
一旦配置好了 Spring 的事務管理器,你就能夠在 Spring 中按你平時的方式來配置事務。express
而且支持 @Transactional 註解和 AOP 風格的配置。在事務處理期間,一個單獨的 SqlSession
對象將會被建立和使用。當事務完成時,這個 session 會以合適的方式提交或回滾。session
要開啓 Spring 的事務處理功能,在 Spring 的配置文件中建立一個 DataSourceTransactionManager
對象:app
測試事務代碼:測試
事務的添加刪除要麼同時成功要麼同時失敗spa
public List<User> findAll() throws Exception {
User user=new User();
user.setAge(30);
user.setEmail("12121212@qq.com");
user.setPassword("111111");
user.setName("yanggoushen");
user.setId(5);
user.setGender(1);
user.setPhone("1212121212");
UserMapper mapper = getSqlSession().getMapper(UserMapper.class);
mapper.addUser(user);
mapper.deleteUser(5);
return mapper.findAll();
}
配置文件代碼code
配置聲明式事務(須要關聯數據庫)對象
配置tx事務通知 須要指定給哪些方法添加事務事務
配置事務切入須要指定哪些類會被事務管理 須要引入事務tx和切入點
<!--配置聲明式事務-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--結合AOP實現事務織入-->
<!--配置事務通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!--給哪些方法配置事務-->
<tx:attributes>
<tx:method name="add" propagation="REQUIRED"/>
<tx:method name="delete"/>
<tx:method name="update"/>
<tx:method name="find" read-only="true"/>
<!-- 對全部的方法都已默認的事務方式執行-->
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!--配置事務切入-->
<aop:config>
<!--這個包下的全部方法都會被事務管理-->
<aop:pointcut id="pointcut" expression="execution(* com.xuan.mapper.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
</aop:config>
補充一下事務管理對方法條件限定的屬性propagation
在聲明式的事務處理中,要配置一個切面,其中就用到了propagation,表示打算對這些方法怎麼使用事務,是用仍是不用,其中propagation有七種配置,REQUIRED、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER、NESTED。默認是REQUIRED。
REQUIRED:支持當前事務,若是當前沒有事務,就新建一個事務。這是最多見的選擇。
SUPPORTS:支持當前事務,若是當前沒有事務,就以非事務方式執行。
MANDATORY:支持當前事務,若是當前沒有事務,就拋出異常。
REQUIRES_NEW:新建事務,若是當前存在事務,把當前事務掛起。
NOT_SUPPORTED:以非事務方式執行操做,若是當前存在事務,就把當前事務掛起。
NEVER:以非事務方式執行,若是當前存在事務,則拋出異常。
NESTED:支持當前事務,若是當前事務存在,則執行一個嵌套事務,若是當前沒有事務,就新建一個事務。