我有一个案例,其中一个事务被启动并且在路上(在代码中)调用一个方法来启动一个新的事务。内部事务完成后,数据将保留在数据库中,但数据在外部事务中不可见。
这是代码段..
@Transactional(readOnly = true)
public void doSomething() {
// Some stuff happens here
doMoreStuff();
// Some more stuff happens here.
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void doMoreStuff() {
...
}
“doMoreStuff”方法更新数据库中的一些数据,之后“doSomething”方法需要查看更新的数据,但事实并非如此。例如,“doMoreStuff”将布尔值从false设置为true并将其保持不变。 “doSomething”方法仍然只是将值视为false。
有什么建议吗?
答案 0 :(得分:2)
我不知道如何在Hibernate中完成事务“嵌套”(因为我不相信MySQL实际上可以嵌套事务)。
所以我假设第二个(嵌套的)事务必须(?)是数据库的新连接 - 否则就不可能在不影响“外部”事务的情况下回滚“嵌套”事务。
如果情况确实如此,那么您可能会遇到MySQL的默认隔离级别REPEATABLE READ
,它不会让外部事务看到之后提交的任何数据该交易开始了。
要测试此理论,请尝试将(外部事务的)隔离级别更改为READ COMMITTED
,看看是否能解决问题。
答案 1 :(得分:1)
嵌套交易 - 请使用 - Propagation.PROPAGATION_NESTED