12.Spring聲明式事務管理

12.Spring聲明式事務管理

  • 使用 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支持當前事務,若是當前事務存在,則執行一個嵌套事務,若是當前沒有事務,就新建一個事務。

相關文章
相關標籤/搜索