1 .添加位置
1)接口實現類或接口實現方法上,而不是接口類中。
2)訪問權限:public 的方法才起作用。@Transactional 注解應該只被應用到 public 方法上,這是由 Spring AOP 的本質決定的。
系統設計:將標簽放置在需要進行事務管理的方法上,而不是放在所有接口實現類上:只讀的接口就不需要事務管理,由于配置了@Transactional就需要AOP攔截及事務的處理,可能影響系統性能。
3)錯誤使用:
1.接口中A、B兩個方法,A無@Transactional標簽,B有,上層通過A間接調用B,此時事務不生效。2.接口中異常(運行時異常)被捕獲而沒有被拋出。默認配置下,spring 只有在拋出的異常為運行時 unchecked 異常時才回滾該事務,也就是拋出的異常為RuntimeException 的子類(Errors也會導致事務回滾),而拋出 checked 異常則不會導致事務回滾 。可通過 @Transactional rollbackFor進行配置。3.多線程下事務管理因為線程不屬于 spring 托管,故線程不能夠默認使用 spring?的事務,也不能獲取spring 注入的 bean 。在被 spring 聲明式事務管理的方法內開啟多線程,多線程內的方法不被事務控制。一個使用了@Transactional 的方法,如果方法內包含多線程的使用,方法內部出現異常,不會回滾線程中調用方法的事務。