1. 程式人生 > 實用技巧 >12.Spring宣告式事務管理

12.Spring宣告式事務管理

12.Spring宣告式事務管理

  • 使用 MyBatis-Spring 的其中一個主要原因是它允許 MyBatis 參與到 Spring 的事務管理中。

  • 而不是給 MyBatis 建立一個新的專用事務管理器,MyBatis-Spring 藉助了 Spring 中的 DataSourceTransactionManager 來實現事務管理。

  • 一旦配置好了 Spring 的事務管理器,你就可以在 Spring 中按你平時的方式來配置事務。

  • 並且支援 @Transactional 註解和 AOP 風格的配置。在事務處理期間,一個單獨的 SqlSession 物件將會被建立和使用。當事務完成時,這個 session 會以合適的方式提交或回滾。

  • 要開啟 Spring 的事務處理功能,在 Spring 的配置檔案中建立一個 DataSourceTransactionManager 物件:

測試事務程式碼:

  • 事務的新增刪除要麼同時成功要麼同時失敗

public List<User> findAll() throws Exception {
User user=new User();
user.setAge(30);
user.setEmail("[email protected]");
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();
}

配置檔案程式碼

  • 配置宣告式事務(需要關聯資料庫)

  • 配置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支援當前事務,如果當前事務存在,則執行一個巢狀事務,如果當前沒有事務,就新建一個事務。