(本文出自oschina博主文章:https://my.oschina.net/happyBKs/blog/1624482)
spring對事務(wù)的管理咱枉,之前的博客文章中也介紹過,不再詳細累述汇恤。
本文想說的是庞钢,當(dāng)@Transactional不起作用如何排查問題。
可以按照以下幾個步驟逐一確認:
首先要看數(shù)據(jù)庫本身對應(yīng)的庫因谎、表所設(shè)置的引擎是什么基括。MyIsam不支持事務(wù),如果需要财岔,則必須改為InnnoDB风皿。
@Transactional所注解的方法是否為public
@Transactional所注解的方法所在的類,是否已經(jīng)被注解@Service或@Component等匠璧。
需要調(diào)用該方法桐款,且需要支持事務(wù)特性的調(diào)用方是在在 @Transactional所在的類的外面。注意:類內(nèi)部的其他方法調(diào)用這個注解了@Transactional的方法夷恍,事務(wù)是不會起作用的魔眨。
-
注解為事務(wù)范圍的方法中,事務(wù)的回滾僅僅對于unchecked的異常有效酿雪。對于checked異常無效遏暴。也就是說事務(wù)回滾僅僅發(fā)生在出現(xiàn)RuntimeException或Error的時候。
如果希望一般的異常也能觸發(fā)事務(wù)回滾指黎,需要在注解了@Transactional的方法上朋凉,將 @Transactional回滾參數(shù)設(shè)為:@Transactional(rollbackFor=Exception.class)
-
非springboot項目,需要檢查spring配置文件xml中:
- 掃描包范圍是否配置好醋安,否則不會在啟動時spring容器中創(chuàng)建和加載對應(yīng)的bean對象杂彭。
<context:component-scan base-package="com.happybks" ></context:component-scan>
- 事務(wù)是否已經(jīng)配置成開啟
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
-
springboot項目有兩個可選配置,默認已經(jīng)支持事務(wù)了吓揪,可以寫也可以不寫亲怠。
- 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