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

Java Spring Boot+JPA:@Transactional注释:回滚不起作用,java,spring,spring-boot,jpa,Java,Spring,Spring Boot,Jpa,我将@Transactional与spring boot和jpa一起使用。但它不起作用。有人能帮忙吗 我的插入在myDAO中,它在服务类中自动连接。下面的代码是实现服务接口的服务类的方法 class MyService implements Service { @Transactional(rollbackFor = RuntimeException.class) public ResponseVO createOrder(params) { myDAO.insertInTab

我将@Transactional与spring boot和jpa一起使用。但它不起作用。有人能帮忙吗

我的插入在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
         }

 }

从给出的代码数量很难判断。我知道如果是RuntimeException,您不应该需要rollboor。这些总是被回滚。我猜您的表名错误是一个SQLException,它实现了异常。您必须将rollboor设置为rollboor=SQLException.class,我只会在验证回滚是否发生时将其保留。只有在服务调用的方法中抛出选中的异常时,才添加rollboor。

尝试以下操作:

@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = RuntimeException.class)
我希望有帮助


干杯

在Spring Boot中,OpenSessionInView在默认情况下处于启用状态,因此回滚不起作用,因为每次调用myDAO.InsertingTablex时,都会执行提交

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

spring.jpa.open-in-view=false
到您的application.properties

有关更多信息,请参见运行时异常已被处理


替换为@TransactionalrollbackFor=Exception.class以管理所有已检查的异常并将其工作

问题在于MySQL数据库引擎。我的引擎是MYIsam,它不支持事务。我把我的数据库引擎改成了InnoDB,它可以工作了。谢谢你的贡献。下面是对相同问题的查询

选择引擎 来自信息\u schema.TABLES 哪里 表名称='表名称' 和表_SCHEMA='db_name'


ALTER TABLE_name ENGINE=INNODB

这里没有错,请提供更多信息:您的回滚只针对RuntimeException,错误的表不会创建RuntimeException。阅读@Transactional manual.@Zorglube,我尝试用new创建新的运行时异常。即使没有回滚。看起来你不明白你在做什么,你不需要自己伪造一个异常,你需要选择你回滚或不回滚的异常类型。createOrder方法从哪里调用?我也试过了。但是没有用。但通常运行时异常将处理所有类型的异常。所以它也应该捕获这个异常,rollback.SQLException是exception的子类,而不是RuntimeException。RuntimeException是Exception的一个子类。只有RuntimeException的子类会被回滚。我还将尝试rollbackFor部分中的Exception.class,放弃它与抛出的异常类型无关?问题很简单bro。。他没有一个条款;用于使用hibernate方言更改为INNODB的公共响应createOrderparams{},请参阅