Spring宣告式事務管理、事務的傳播行為xml配置
阿新 • • 發佈:2019-01-11
1. <tx:method name="insert*" propagation="REQUIRED" />中name的值是ServiceImpl中各個要加入事物管理的方法的方法名。
<!-- 事務管理: Spring宣告式事務管理 。 spring預設的事務隔離級別是用的資料庫的預設事務隔離級別,不同資料庫級別也不盡相同。 使用事務,要引入aop和tx的名稱空間 :即檔案頭第4行。 (開啟註解事務,使用時在方法上加上註解@Transactional(...)即可 ) --> <!-- 事務管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 通知傳播行為 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="insert*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="upd*" propagation="REQUIRED" /> <!-- 只讀表示對資料的操作是讀取,報異常後不用回滾(不是隻讀的資料出異常,事務會回滾)。 --> <tx:method name="select*" propagation="SUPPORTS" read-only="true" /> <tx:method name="get" propagation="SUPPORTS" read-only="true" /> </tx:attributes> </tx:advice> <!-- 配置事務切入點 --> <aop:config> <aop:pointcut id="servicePointcut" expression="execution(* com.service.impl..*ServiceImpl.*(..))"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="servicePointcut"/> </aop:config>
2. 儘量把邏輯操作程式碼寫到Service中,controller是沒有納入spring的事務管理的。出現異常不會回滾。
3. 相關說明:
spring中PROPAGATION類的事務屬性詳解
PROPAGATION_REQUIRED:
支援當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。
PROPAGATION_SUPPORTS:
支援當前事務,如果當前沒有事務,就以非事務方式執行。
PROPAGATION_MANDATORY:
支援當前事務,如果當前沒有事務,就丟擲異常。
PROPAGATION_REQUIRES_NEW:
新建事務,如果當前存在事務,把當前事務掛起。
PROPAGATION_NOT_SUPPORTED:
以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
PROPAGATION_NEVER:
以非事務方式執行,如果當前存在事務,則丟擲異常。
PROPAGATION_NESTED:
支援當前事務,如果當前事務存在,則執行一個巢狀事務,如果當前沒有事務,就新建一個事務。