(本文出自oschina博主文章:https://my.oschina.net/happyBKs/blog/1624482)
spring對事務的管理,之前的博客文章中也介紹過,不再詳細累述。
本文想說的是,當@Transactional不起作用如何排查問題。
可以按照以下幾個步驟逐一確認:
首先要看數(shù)據(jù)庫本身對應的庫、表所設置的引擎是什么。MyIsam不支持事務,如果需要,則必須改為InnnoDB。
@Transactional所注解的方法是否為public
@Transactional所注解的方法所在的類,是否已經(jīng)被注解@Service或@Component等。
需要調用該方法,且需要支持事務特性的調用方是在在 @Transactional所在的類的外面。注意:類內部的其他方法調用這個注解了@Transactional的方法,事務是不會起作用的。
-
注解為事務范圍的方法中,事務的回滾僅僅對于unchecked的異常有效。對于checked異常無效。也就是說事務回滾僅僅發(fā)生在出現(xiàn)RuntimeException或Error的時候。
如果希望一般的異常也能觸發(fā)事務回滾,需要在注解了@Transactional的方法上,將 @Transactional回滾參數(shù)設為:@Transactional(rollbackFor=Exception.class) -
非springboot項目,需要檢查spring配置文件xml中:
- 掃描包范圍是否配置好,否則不會在啟動時spring容器中創(chuàng)建和加載對應的bean對象。
<context:component-scan base-package="com.happybks" ></context:component-scan>- 事務是否已經(jīng)配置成開啟
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/> -
springboot項目有兩個可選配置,默認已經(jīng)支持事務了,可以寫也可以不寫。
- springboot啟動類,即程序入口類,需要注解@EnableTransactionManagement
package com.happybks.pets; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.transaction.annotation.EnableTransactionManagement; @EnableTransactionManagement @SpringBootApplication public class PetsApplication { public static void main(String[] args) { SpringApplication.run(PetsApplication.class, args); } }- springboot配置文件application.yml中,可以配置上失敗回滾:
spring: profiles: active: prod datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/spbdb username: root password: jpa: hibernate: ddl-auto: show-sql: true transaction: rollback-on-commit-failure: true