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

未在Hibernate StaleObjectStateException上回滚Spring事务

司徒杜吟
2023-03-14

我有一个场景如下

methodA(){

try{
  objB.methodB();
}
catch(Exception ex){
  log(exception caught);
}

@Transactional(value = "txManager", propagation = Propagation.REQUIRES_NEW,rollbackFor={Exception.class, StaleObjectStateException.class})
methodB(){
   methodC();
}

@Transactional(value = "txManager", propagation = Propagation.REQUIRED, rollbackFor = {Exception.class,StaleObjectStateException.class})
methodC(){
  /*Some logic that throws HOLF/SOSE exception. Essentially calling merge on entity that has @Version enabled
}

我的问题是,对于一个给定的流,我可能有两个请求同时调用这个方法。我希望methodC抛出乐观锁定失败和回滚事务的异常。

发生的情况如下:R1和R2调用methodA->methodB(启动一个新事务)->methodC(启动一个新事务):两个都读取相同的实体版本,都进行相同的更改并调用merge->methodC完成流回methodB->methodB完成强制事务提交->事务提交->抛出运行时异常,因为乐观锁定没有回滚,异常被methodA捕获。

如果在methodC中显式抛出异常,则transaction会回滚。

我不确定为什么在抛出Optimisitc锁失败异常时不回滚事务。

共有1个答案

上官景铄
2023-03-14

好吧..所以我好像让它起作用了。结果发现问题出在JTA提供程序上。我在Tomee上部署了代码,这将确保Spring从tomcat库中选择提供者,并且它使用了Gerenimo,这似乎不处理回滚。我在weblogic上推送了相同的代码,并使用org.hibernate.service.JTA.platform.internal.WebLogicJTaPlatform作为JTA提供程序,这似乎是按照预期工作的。如果我得到了Gerenimo不工作的原因,或者有什么东西我错过了它,我会发帖。

 类似资料:
  • 我有一个事务性方法,我想调用另一个可能引发RuntimeException的方法。 问题是,当引发异常时,事务被标记为rollbackOnly。 编辑: 我不认为这是重复指定@Transactional rollbackFor也包括RuntimeException,因为异常最终会被捕获。 问题可能类似,因为它也涉及事务和回滚。

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

  • 我在使用@Transactional注释进行事务回滚时遇到了一个问题。 我在backingbean、service和dao类中有以下方法:

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

  • 我使用spring 3.2并有一些事务。当我遇到异常时,回滚似乎没有完成。 我的代码 } 基本上,我有一个类X,createX方法启动一个事务。它调用createY谁调用call YY。在这个方法中发生了异常。我在想,那么自createX以来的所有持久操作都将被回滚,但这不是谁发生的 我在日志中没有看到交易信息 任何想法

  • 我列出了一个问题“Spring事务失败回滚”。我有一个服务类,它调用2 DAO将数据插入到数据库表中。 我的事务配置: 我的服务和dao定义如下: