Java 嵌套事务用例中的外部事务是';看到数据库中持久化的更新(JPA、MySQL、Spring框架和Hibernate)
我有一个例子,在这个例子中,一个事务被启动,并且一路上(在代码中)会调用一个方法来启动一个新的事务。当内部事务完成时,数据将保留在数据库中,但从外部事务看不到数据 以下是代码片段 “doMoreStuff”方法更新数据库中的一些数据,之后“doSomething”方法需要查看更新后的数据,但事实并非如此。例如,“doMoreStuff”将布尔值从false设置为true,并将其持久化。“doSomething”方法仍然只看到值为falseJava 嵌套事务用例中的外部事务是';看到数据库中持久化的更新(JPA、MySQL、Spring框架和Hibernate),java,mysql,hibernate,spring,jpa,Java,Mysql,Hibernate,Spring,Jpa,我有一个例子,在这个例子中,一个事务被启动,并且一路上(在代码中)会调用一个方法来启动一个新的事务。当内部事务完成时,数据将保留在数据库中,但从外部事务看不到数据 以下是代码片段 “doMoreStuff”方法更新数据库中的一些数据,之后“doSomething”方法需要查看更新后的数据,但事实并非如此。例如,“doMoreStuff”将布尔值从false设置为true,并将其持久化。“doSomething”方法仍然只看到值为false 有什么建议吗?嵌套事务-请使用-Propagation.
有什么建议吗?嵌套事务-请使用-
Propagation.Propagation\u Nested
我不知道事务“嵌套”是如何在Hibernate中完成的(因为我不相信MySQL实际上可以嵌套事务)
因此,我假设第二个(嵌套的)事务必须(?)是到数据库的新连接,否则就不可能回滚“嵌套的”事务而不影响“外部”事务
如果确实如此,那么您可能会受到MySQL默认隔离级别的影响,该级别为REPEATABLE READ
,它不会让外部事务看到该事务启动后提交的任何数据
为了测试这一理论,尝试将隔离级别(外部事务的)更改为
readcommitted
,看看这是否解决了问题。尝试这一点,但是,我目前得到了“标准JPA不支持自定义隔离级别-为您的JPA实现使用一个特殊的JpaDialect”…这是真的,JPA不支持它。我必须在mysql中设置全局tx级别:设置全局事务隔离级别read COMMITED;这似乎奏效了。现在只需要调整我的mysql配置文件,使设置保持不变:)谢谢!
@Transactional(readOnly = true)
public void doSomething() {
// Some stuff happens here
doMoreStuff();
// Some more stuff happens here.
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void doMoreStuff() {
...
}