SpringBoot2.0中的事務@Transactional


在SpringBoot2.0中使用使用需要注意的地方。

1. 加@Transactional的方法不能是private和protected修飾,private會直接報編譯錯誤,protected不會報錯。但是事務不起作用。

2. @Transactional可以放在Controller下面直接起作用,看到網上好多同學說要放到@Component下面或者@Service下面,經過試驗,可以不用放在這兩個下面也起作用。

3. @Transactional引入包問題,她有兩個包:import javax.transaction.Transactional; 和 import org.springframework.transaction.annotation.Transactional; 這兩個都可以用,對比了一下他們兩個的方法和屬性,發現后面的比前面的強大。建議后后面的。

4. @Transactional采用AOP實現的。

    在進行方法調用的時候,發現這個方法有事務注解,AOP首先會檢測到,然后用代理類采用反射機制進行調用。

    1. 首先調用了CglibAopProxy.intercept()方法。

    2. 接下來調用ReflectiveMethodInvocation.proceed()方法,

    3. TransactionInterceptor.invoke()

    4. TransactionAspectSupport.invokeWithinTransaction()

    5. TransactionAspectSupport.createTransactionIfNecessary()

    6. AbstractPlatformTransactionManager.getTransaction(),創建了一個新的事務。

5. PlatformTransactionManager 這個接口中定義了三個方法 getTransaction創建事務,commit 提交事務,rollback 回滾事務。她的實現類是 AbstractPlatformTransactionManager這個。

6. 在Transactional這個中,有一個參數 Propagation的屬性,他里面有七中類型,REQUIRED,REQUIRES_NEW,NESTED,這三個都是新建事務,其他的都不實用事務。

8. 當一個方法中嵌套使用@Transactional。如果沒有設置屬性 Propagation,默認為REQUIRED,她只會在上下文創建一個事務。當設置屬性為REQUIRES_NEW的時候,她會創建一個新的事務。

9. try catch的使用,當一個事務中如果對異常進行了捕獲,而且沒有拋出異常的情況下,事務是不起作用的,只有拋出異常,事務會自己trycatch,然后進行回滾操作。

10. 問題注意:

如果使用Mysql數據庫,需要注意創建表的引擎。支持InnoDD,默認創建表是 MyISAM

如果配置了 自動創建,需要這樣配置

jpa:
hibernate:
ddl-auto: update
show-sql: true
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect

參考學習:騰訊公開課,雲析學院公開課。

 

    


免責聲明!

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



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