我有一个场景如下
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锁失败异常时不回滚事务。
好吧..所以我好像让它起作用了。结果发现问题出在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定义如下: