嵌套事务用例中的外部事务没有看到数据库中持久存在的更新(JPA,MySQL,Spring Framework和Hibernate)

时间:2011-01-04 12:13:13

标签: java mysql hibernate spring jpa

我有一个案例,其中一个事务被启动并且在路上(在代码中)调用一个方法来启动一个新的事务。内部事务完成后,数据将保留在数据库中,但数据在外部事务中不可见。

这是代码段..

@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。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

我不知道如何在Hibernate中完成事务“嵌套”(因为我不相信MySQL实际上可以嵌套事务)。

所以我假设第二个(嵌套的)事务必须(?)是数据库的新连接 - 否则就不可能在不影响“外部”事务的情况下回滚“嵌套”事务。

如果情况确实如此,那么您可能会遇到MySQL的默认隔离级别REPEATABLE READ,它不会让外部事务看到之后提交的任何数据该交易开始了。

要测试此理论,请尝试将(外部事务的)隔离级别更改为READ COMMITTED,看看是否能解决问题。

答案 1 :(得分:1)

嵌套交易 - 请使用 - Propagation.PROPAGATION_NESTED