为什么加了@Transactional注解,事务没有回滚?

简介: 为什么加了@Transactional注解,事务没有回滚?

在昨天的《事务管理入门》一文发布之后,有读者联系说根据文章尝试,加了@Transactional注解之后,事务并没有回滚。

经过一顿沟通排查之后,找到了原因,在此记录一下,给后面如果碰到类似问题的童鞋一个参考。

问题原因

在前文的描述中,我漏了一个细节,其实在示例代码中,与之前拿的基础例子在配置中有一个关键属性没有提到,就是下面这个配置:

spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect

这里的spring.jpa.database-platform配置主要用来设置hibernate使用的方言。这里特地采用了MySQL5InnoDBDialect,主要为了保障在使用Spring Data JPA时候,Hibernate自动创建表的时候使用InnoDB存储引擎,不然就会以默认存储引擎MyISAM来建表,而MyISAM存储引擎是没有事务的。

所以,如果你的事务没有生效,那么可以看看创建的表,是不是使用了MyISAM存储引擎,如果是的话,那就是这个原因了!

扩展阅读

@Transactional注解不生效,是Spring使用者非常常见的一类问题,上面我们讲了一种,其他还有一些可能的原因,这里作为扩展阅读一并列出。

如果你当前碰到的原因不是上面的情况,那就看看下面这几种情况是否存在:

  1. @Transactional注解修饰的函数中catch了异常,并没有往方法外抛。不过,也有一写复杂场景可能不一样,比如我这里出的四个题中的test4:我来出个题:这个事务会不会回滚?
  2. @Transactional注解修饰的函数不是public类型
  3. 异常类型错误,如果有通过rollbackFor指定回滚的异常类型,那么抛出的异常与指定的是否一致。
  4. 数据源没有配置事务管理器
  5. 在一个类中调用自己的方法。建议分开写,互相调用。
  6. 对应数据库使用的存储引擎不支持事务,比如:MyISAM。
目录
相关文章
|
Java API p3c
【Java基础】@Transactional(rollbackFor=Exception.class)的使用
@Transactional(rollbackFor=Exception.class)的使用
774 0
【Java基础】@Transactional(rollbackFor=Exception.class)的使用
|
Java Maven
【Java报错】显示错误“Error:java: 程序包org.springframework.boot不存在“
【Java报错】显示错误“Error:java: 程序包org.springframework.boot不存在“
1047 3
|
存储 SQL 关系型数据库
MySQL 给查询结果增列并自定义列数据
MySQL 给查询结果增列并自定义列数据
1676 2
|
开发工具 Android开发 git
解决Idea报错出现Git is not installed
解决Idea报错出现Git is not installed
4674 2
|
SQL Java 数据库连接
spring声明式事务 @Transactional 不回滚的多种情况以及解决方案
spring声明式事务 @Transactional 不回滚的多种情况以及解决方案
520 0
|
SQL Java 数据库连接
mybatis查询数据时,返回类型设置的map,然后出现这个错误java.lang.NoSuchMethodException: java.util.Map.<init>
mybatis查询数据时,返回类型设置的map,然后出现这个错误java.lang.NoSuchMethodException: java.util.Map.<init>
474 0
|
消息中间件 存储 缓存
RocketMQ - 消费者概述
RocketMQ - 消费者概述
444 0
|
消息中间件 存储 缓存
技术好文:RocketMQ之一:RocketMQ整体介绍
技术好文:RocketMQ之一:RocketMQ整体介绍
400 0
|
存储 Java API
Java——Stream流(1/2):Stream流入门、Stream流的创建(认识Stream、体验Stream流、Stream流的使用步骤、获取Stream流的方法)
Java——Stream流(1/2):Stream流入门、Stream流的创建(认识Stream、体验Stream流、Stream流的使用步骤、获取Stream流的方法)
333 0
|
消息中间件 RocketMQ
在RocketMQ中,消息的读写与生产者消费者的数量以及Broker数量都有关
在RocketMQ中,消息的读写与生产者消费者的数量以及Broker数量都有关
640 1