当前位置: 首页 > 知识库问答 >
问题:

RuntimeException上的Spring事务回滚

李安歌
2023-03-14

我有一个事务性方法,我想调用另一个可能引发RuntimeException的方法。

问题是,当引发异常时,事务被标记为rollbackOnly。

@Service
public class MyService {

    @Autowired
    private MyUtils utils;

    @Autowired
    private MyCrudRepository repository;

    @Transactional
    public void publicMethod() {
       try {
           utils.otherPublicMethod();
       } catch (Exception ex) {
           ex.printStackTrace();
       }

       // RollbackException: Transaction marked as rollbackOnly
       // Even though I caught the exception from the method call itself
       repository.save(new MyEntity());
    }
}
@Component
public class MyUtils {

    // Does not use transactions, repositories
    // But I think it inherits the transaction and marks it as rollbackOnly
    public void otherPublicMethod() {

        // Maybe this is seen as an uncaught exception
        throw new RuntimeException();
    }
}

编辑:

我不认为这是重复指定@Transactional rollbackFor也包括RuntimeException,因为异常最终会被捕获。
问题可能类似,因为它也涉及事务和回滚。

共有1个答案

何章横
2023-03-14

批注@transactional具有诸如rollbackforno-rollback-for这样的参数,您可以通过这些参数判断哪些异常会导致或不会导致回滚。例如,您可以写:

@Transactional(rollbackFor = {RuntimeException.class})

这将导致对RuntimeException的回滚。但是,我认为RuntimeException默认情况下会导致回滚。因此,您可能必须在no-rollback-for子句中指定此异常。有关详细信息,请参阅事务管理,并查找“16.5.5设置”段落

 类似资料:
  • 尽管捕获了RuntimeException并声明了noRollbackFor属性,但事务总是回滚。有什么解释吗?? 日志跟踪信息:

  • 我正在使用DAO进行事务管理。场景是创建包含quote_line和客户列表的新报价。如果客户不存在,它将把它插入表客户中。我的代码是如下架构: 在调试模式下,我只有两个变量:1-这(QuoteService)2-quote 这是th日志: 您可以注意到,消息“第44行删除”已打印,但没有从hibernate查询中删除的痕迹。 这段代码不起作用:使用customerDao和quoteLineDao的

  • 我有一个场景如下 我的问题是,对于一个给定的流,我可能有两个请求同时调用这个方法。我希望methodC抛出乐观锁定失败和回滚事务的异常。 发生的情况如下:R1和R2调用methodA->methodB(启动一个新事务)->methodC(启动一个新事务):两个都读取相同的实体版本,都进行相同的更改并调用merge->methodC完成流回methodB->methodB完成强制事务提交->事务提交

  • 我在这里尽量简明扼要。我已经研究了网络上报告的许多类似问题,并根据这些问题评估了我的问题。但是,这并没有解决我的问题。所以我终于把这个放上去了。 我有一个带有默认值的spring注释的事务性服务(在实现的类方法上进行了注释)。该服务通过直接调用mybatis映射器方法(在服务中自动连线)来执行一些插入(在循环中)和无参数存储过程调用。 我在Tomcat和驱动程序管理器连接单元测试中使用JNDI连接

  • -ZJ 以下是我在Application.Properties中的数据源设置: