Spring Boot 2.0 使用data JPA @Transactional 報錯事務不回滾

最近升級使用了Spring boot 2.0 發現Service層報錯時,事物仍然進行了提交。通過查找各方資料。大致原因歸納爲一下幾種:

1、檢查你方法是不是public的

2、你的異常類型是不是unchecked異常 
如果我想check異常也想回滾怎麼辦,註解上面寫明異常類型即可

@Transactional(rollbackFor=Exception.class) 
  • 1

類似的還有norollbackFor,自定義不回滾的異常

3、數據庫引擎要支持事務,如果是MySQL,注意表要使用支持事務的引擎,比如innodb,如果是MyISAM,事務是不起作用的。

我的主要是第三種原因造成的。

Spring Boot 2.0使用data Jpa時。創建表默認使用的是MyISAM引擎,但是Mysql MyISAM引擎是不支持事務的。所以把數據庫的表改爲innodb 引擎就行了。

--------------------------- 不想一個個改表的存儲結構?繼續往下看---------------

但是,有沒有一勞永逸的方法呢?

有的!

Spring Boot 2.0 使用的Jpa 版本是2.0.0

<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.0.0.RELEASE</version>

這個版本的JPA使用的是hibernate 5.2.14


在這個版本中 之前一直使用的方言被廢棄了 MySQL5InnoDBDialect 已經被廢棄了。MySQL5InnoDBDialect 主要適用於MySQL5.5版本,5.5之後的版本,hibernate給出了其他的解決方案,MySQL55Dialect 和 MySQL55Dialect ()


所以5.5以後的版本根據mysql的版本,需要採用合適的方言。例如,我是用的mysql5.6的所以就最後使用 MySQL5InnoDBDialec

所以修改spring jpa配置如下 我使用的是yml

jpa:
  database: MYSQL
  hibernate:
    ddl-auto: update
  show-sql: true
  database-platform: org.hibernate.dialect.MySQL5InnoDBDialect

這裏就不需要配置 hibernate 的dialect 了

把之前的表刪掉,重啓看一下吧,現在創建的表都是innoDB引擎了。並且@Transactional 再報錯,事務也可以回滾了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章