Spring Boot + JPA:@Transactional注释:回滚不起作用

时间:2019-01-21 15:26:01

标签: java spring spring-boot jpa

我在Spring Boot和jpa中使用@Transactional。但这是行不通的。有人可以帮忙吗?

我的插件位于myDAO中,该类在服务类中自动接线。下面的代码是实现服务接口的服务类方法

class MyService implements Service {

@Transactional(rollbackFor = RuntimeException.class)
    public ResponseVO createOrder(params) {
    myDAO.insertInTable1(param);
    myDAO.insertInTable2(param);//I kept wrong table name in this query such that it throws exception
         }

 }

5 个答案:

答案 0 :(得分:3)

问题与MySQL数据库引擎有关。我的引擎是MYIsam,它不支持事务。我将数据库引擎更改为InnoDB及其工作方式。感谢您的贡献。以下是对它们的查询。

选择引擎 从information_schema.TABLES 哪里   TABLE_NAME ='tabel_name'   AND TABLE_SCHEMA ='db_name';

ALTER TABLE table_name ENGINE = INNODB;

答案 1 :(得分:1)

尝试一下:

@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = RuntimeException.class)

希望对您有帮助。

干杯!

答案 2 :(得分:1)

RuntimeException已被处理

替换为@Transactional(rollbackFor = Exception.class)以管理所有已检查的异常,并且可以正常工作

答案 3 :(得分:0)

很难从给出的代码量中分辨出来。我知道您不需要rollbackFor,如果它是RuntimeException。这些总是回滚。我猜您的表名错误是实现SQLException的{​​{1}}。您必须将Exception设为rollbackFor,而我只会在验证是否发生回滚时将其保留下来。仅当在服务调用的方法中引发检查异常时,才添加rollbackFor。

答案 4 :(得分:-1)

在Spring Boot中,默认情况下启用OpenSessionInView,因此回滚不起作用,因为每次调用myDAO.insertInTableX()时,都会执行一次Commit。

因此,要删除此行为并使您的@Transactional正常运行,请添加以下内容:

spring.jpa.open-in-view=false

转到您的 application.properties

有关更多信息,请参见this question