總結:springboot中在方法上(或類上)聲明@Transactional注解即可在springboot中使用事務。
一。在Spring Boot中,當我們使用了spring-boot-starter-jdbc或spring-boot-starter-data-jpa依賴的時候,框 架會自動預設分别注入DataSourceTransactionManager或JpaTransactionManager。是以我們不需要任何額外配置就可以用@Transactional注解進行事務的使用。而一般我們使用的mybatis-spring-boot-starter中含有spring-boot-starter-jdbc依賴,是以pom.xml中引入了springboot的mybatis的依賴包即可。下面代碼可列印spring中的事務管理者(platformTransactionManager對象容器會自動注入):
@Bean
public Object testBean(PlatformTransactionManager platformTransactionManager){
System.out.println(">>>>>>>>>>" + platformTransactionManager.getClass().getName());
return new Object();
}
二。可選配置:啟動類上添加@EnableTransactionManagement注解開啟事務支援。
其實SpringBoot在TransactionAutoConfiguration類裡為我們自動配置啟動了@EnableTransactionManagement注解,是以也可不顯示聲明。
@SpringBootApplication
@EnableTransactionManagement // 開啟事務支援
三。預設配置下 Spring 隻會復原運作時、未檢查異常(繼承自 RuntimeException 的異常)或者 Error。要想對Exception中的受檢異常也生效,需自定義@Transactional的屬性,即@Transactional(rollbackFor = Exception.class)
四。@Transactional 注解隻能應用到 public 方法才有效。
五。@Transactional可以作用于接口,接口方法上,類,類的方法上。但是Spring官方不建議接口或者接口方法上使用該注解,因為這隻有在使用基于接口的代理時它才會生效。另外, @Transactional 注解應該隻被應用到 public 方法上,這是由 Spring AOP 的本質決定的。如果你在 protected、private 或者預設可見性的方法上使用 @Transactional 注解,這将被忽略,也不會抛出任何異常。 Spring預設使用的是jdk自帶的基于接口的代理,而沒有使用基于類的代理CGLIB。
六。@Transactional是聲明式事務管理: 建立在AOP之上的。其本質是對方法前後進行攔截,然後在目标方法開始之前建立或者加入一個事務,在執行完目标方法之後根據執行情況送出或者復原事務。