我有一个事务性方法,我想调用另一个可能引发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,因为异常最终会被捕获。
问题可能类似,因为它也涉及事务和回滚。
批注@transactional
具有诸如rollbackfor
和no-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中的数据源设置: