1. 程式人生 > 其它 >Spring中事務相關

Spring中事務相關

技術標籤:面試springjavaaop資料庫

又想到了小米,留下了不甘的淚水,哈哈哈哈


1. 事務傳播行為的7種策略

  1. REQUIRED:必需的(預設值)
    如果當前沒有事務執行,則會開啟一個新的事務;如果當前已經有事務執行,則方法會執行在當前事務中,“你沒有,我開啟,你有了,我加入”
  2. REQUIRES_NEW:新事務
    如果當前沒有事務事務執行,則會開啟一個新的事務;如果當前已經有事務執行,則會將原事務掛起,重新開啟一個新的事務。當新的事務執行完畢後,再將原來的事務釋放,“你沒有我開啟,你有了我造新的”
  3. SUPPORTS:支援
    如果當前有事務執行,則方法執行在當前事務中;如果沒有事務執行,則不在事務中執行
    ,“有就有,沒有拉到”
  4. NOT_SUPPORTED:不支援
    如果當前事務執行,則會將事務掛起,如果當前沒有事務執行,則它也不會執行在事務中,“有我不要,沒有正好”
  5. MANDATORY:強制
    當前方法必須在事務中,如果沒有事務,則直接丟擲異常,“要幹活必須有,沒有就打死不幹”
  6. NEVER:不允許
    當前方法不允許執行在事務中,如果當前已經有事務執行,則丟擲異常,“要幹活不準有,有了不幹活”
  7. 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


暫且這麼多