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