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 已经被废弃了。但仍然可以使用,5.5、5.6版本的数据库可以配置成这个。其他版本的选择正确的就行了。

所以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 再报错,事务也可以回滚了。

如果还不行,查看一下 MySQLDialect.class的源代码可以发现有如下这样的代码:

可以在你的properties文件中加入配置

hibernate.dialect.storage_engine=innodb
 即可。
 
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值