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

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

这是代码片段..

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

有什么建议么?

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

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

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

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

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