SpringBoot设置 @Transactional ,并在异常处理中调用setRollbackOnly()事务不回滚
Posted 辉﹏
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot设置 @Transactional ,并在异常处理中调用setRollbackOnly()事务不回滚相关的知识,希望对你有一定的参考价值。
在SpringBoot 中,使用事务非常简单,只需在方法上面加入 @Transactional 注解就可以实现。也可加在类上,此时则类中所有方法都支持事务。
而当我使用下面代码时,发现事务却没有回滚,异常之前的数据仍然插入了数据库
@Transactional @RequestMapping(value="/create", method=RequestMethod.POST) public Resp createUser(String name, String phone, String password){ try { //... } catch (Exception e) { TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); //... return Resp.error(Resp.ErrorCode.USER_CREATE, null); } return Resp.success(); }
在各种尝试之后,最后发现是mysql中的表类型是MyISAM,而MyISAM存储引擎的一个特点就是不支持事务
解决方法:
之前在配置文件中的设置(使用的默认的存储引擎)
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
修改为(指定为InnoDB)
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
以上是关于SpringBoot设置 @Transactional ,并在异常处理中调用setRollbackOnly()事务不回滚的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot系列(入门,ORM,Transaction,lOG)
Spring Boot 2 / Kotlin / JDK9 - 引起:java.lang.ClassNotFoundException:javax.transaction.SystemExceptio
Spring Boot Stomp-Transaction Sockjs: ERROR message=[Bad transaction] Invalid transaction identifier