在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
參考學習:騰訊公開課,雲析學院公開課。