嵌套事务用例中的外部事务看不到数据库中持久的更新(JPA、MySQL、Spring Framework 和 Hibernate)

cod*_*aig 5 java mysql spring hibernate 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() {
    ...
}
Run Code Online (Sandbox Code Playgroud)

“doMoreStuff”方法更新数据库中的一些数据,之后“doSomething”方法需要查看更新的数据,但事实并非如此。例如,“doMoreStuff”将布尔值从 false 设置为 true 并保留它。“doSomething”方法仍然只将值视为 false。

有什么建议么?

小智 4

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

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

如果情况确实如此,那么您可能会受到 MySQL 默认隔离级别的影响,该级别不会让外部事务看到该事务启动REPEATABLE READ已提交的任何数据。

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