學習Spring-Data-Jpa(二十二)---事務處理


1、@EnableTransactionManagement

  該注解用於啟用Spring的注釋驅動事務管理功能,用於@Configuration類。配置后會負責注冊必要的Spring組件,為注解驅動事務管理提供動力。例如TransactionInterceptor和基於代理或AspectJ的通知,在調用添加@Transactional的方法時,將攔截器編織到堆棧中。

  proxyTargetClass:是否創建基於子類的代理(CGLIB),而不是基於標准Java接口的代理(JDK動態代理),默認為false。僅當mode設置為AdviceMode.PROXY時才適用。需要注意的是,將此屬性設置為true將影響所有需要代理的Spring托管bean,而不僅僅是標記為@Transactional的bean。例如,用@Async注釋標記的其他bean將同時升級為子類代理。
  mode:事務通知的方式。默認是代理模式AdviceMode.PROXY。需要注意的是,代理模式只允許通過代理攔截調用。同一個類中的本地調用不能以這種方式被攔截;本地調用中此類的@Transactional將會被忽略。對於更高級的攔截模式,可以考慮切換到AdviceMode.ASPECTJ,如果模式設置為AdviceMode.ASPECTJ,則將忽略proxyTargetClass屬性的值。還要注意,在這種情況下,spring-aspects模塊JAR必須出現在類路徑上,在這種情況下不涉及代理;本地調用也將被攔截。
  order:在特定連接點應用多個通知時事務處理的執行順序。默認值為Ordered.LOWEST_PRECEDENCE。

 

  正常情況下,需要在我們的配置上類添加@EnableTransactionManagement注解才能開啟事務管理。這個SpringBoot也為我們自動配置了。spring-boot-autoconfigure中的spring.factories里面默認加載org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration查看源碼可以看到里面已經加了此注解,通過添加@Transactional注解配置方法。我們通過查看可以知道,SimpleJpaRepository每個方法都是有事務的。對於讀取操作,事務配置為readOnly為true的。其他操作配置的是一個普通的@Transactional,以便應用默認的事務配置。

     

2、@Transactional

  描述單個方法或類的事務屬性。在類級別,此注釋作為默認值應用於聲明類及其子類的所有方法。請注意,它不適用於類層次結構上的祖先類;

    value/transactionManager:指定事務管理器。bean的名稱。當有多個數據源的時候設置。
    propagation:事務傳播行為。默認為Propagation.REQUIRED。
    isolation:事務隔離級別。默認為Isolation.DEFAULT。基本不需要設置。
    timeout:設置事務的超時秒數,默認永不超時。
    readOnly:設置事務是否是只讀的。如果事務時有效自讀的,設置為true,將會在運行時進行相應的優化。默認為false。
    rollbackFor:指定遇到哪些異常進行事務回滾。默認情況下,將在RuntimeException和Error上回滾。
    rollbackForClassName:功能如rollbackFor,只是這里填寫字符串。
    noRollbackFor:指定遇到哪些異常事務不回滾。
    noRollbackForClassName:功能如noRollbackFor,只是這里填寫字符串。

3、Propagation事務傳播行為

  事務的傳播行為是指:如果在開始當前事務之前,一個事務上下文已經存在,此時有若干選項可以指定一個事務性方法的執行行為。
    Propagation枚舉類中共有七種傳播行為
      REQUIRED:支持當前事務,如果不存在,則創建新事務。
      SUPPORTS:支持當前事務,如果不存在,則執行非事務性事務。
      MANDATORY:支持當前事務,如果不存在則引發異常。
      REQUIRES_NEW:創建一個新事務,如果存在一個事務,則暫停當前事務。
      NOT_SUPPORTED:執行非事務性操作,如果存在,則暫停當前事務。
      NEVER:執行非事務性操作,如果事務存在,則引發異常。
      NESTED:如果當前存在事務,則創建一個事務作為當前事務的嵌套事務來運行;如果當前沒有事務,則該取值等價於REQUIRED。

 

源碼地址:https://github.com/caofanqi/study-spring-data-jpa


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM