Spring中事務相關
阿新 • • 發佈:2021-02-15
又想到了小米,留下了不甘的淚水,哈哈哈哈
1. 事務傳播行為的7種策略
REQUIRED
:必需的(預設值)
如果當前沒有事務執行,則會開啟一個新的事務;如果當前已經有事務執行,則方法會執行在當前事務中,“你沒有,我開啟,你有了,我加入”REQUIRES_NEW
:新事務
如果當前沒有事務事務執行,則會開啟一個新的事務;如果當前已經有事務執行,則會將原事務掛起,重新開啟一個新的事務。當新的事務執行完畢後,再將原來的事務釋放,“你沒有我開啟,你有了我造新的”SUPPORTS
:支援
如果當前有事務執行,則方法執行在當前事務中;如果沒有事務執行,則不在事務中執行NOT_SUPPORTED
:不支援
如果當前事務執行,則會將事務掛起,如果當前沒有事務執行,則它也不會執行在事務中,“有我不要,沒有正好”MANDATORY
:強制
當前方法必須在事務中,如果沒有事務,則直接丟擲異常,“要幹活必須有,沒有就打死不幹”NEVER
:不允許
當前方法不允許執行在事務中,如果當前已經有事務執行,則丟擲異常,“要幹活不準有,有了不幹活”NESTED
:巢狀
如果當前沒有事務執行,則開啟一個新的事務;如果當前已經有事務執行,則會記錄一個儲存點,並繼續執行在當前事務中。如果子事務執行中出現異常,則不會全部回滾,而是回滾到哦上一個儲存點
在註解中,新增propagation屬性即可修改
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void addPoint() {
System.out.println("addPoint 新增積分 ......");
}
2. Spring事務的三大核心
PlatformTransactionManager
:平臺事務管理器,做事務控制TransactionDefinition
:事務定義,包括事務的隔離級別,事務的傳播行為,是否為讀寫事務等等TransactionStatus
:事務狀態,是否有儲存點,是否完成…
3. 宣告式事務
< bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:advice id="transactionAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="saveAndQuery"/>
<tx:method name="addMoney"/>
<tx:method name="subtractMoney"/>
</tx:attributes>
</tx:advice>
在這個 xml 的配置中,配置事務通知,需要指定事務管理器,並配置事務覆蓋的方法,必要的還會配置事務傳播行為。而這個<tx:advice>
標籤的底層,其實是註冊了一個 TransactionInterceptor
public class TransactionInterceptor extends TransactionAspectSupport implements MethodInterceptor, Serializable
可以發現它實現了 MethodInterceptor
介面!通過前面 AOP 部分的學習,我們知道 MethodInterceptor 介面是 AOP 增強的核心攔截器介面,利用 AOP 生成的代理物件中都會包含一組 MethodInterceptor 介面的實現類物件
註解式事務用到的兩個註解@EnableTransactionManagement
,@Transactional
暫且這麼多