Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 嵌套事务用例中的外部事务是';看到数据库中持久化的更新(JPA、MySQL、Spring框架和Hibernate)_Java_Mysql_Hibernate_Spring_Jpa - Fatal编程技术网

Java 嵌套事务用例中的外部事务是';看到数据库中持久化的更新(JPA、MySQL、Spring框架和Hibernate)

Java 嵌套事务用例中的外部事务是';看到数据库中持久化的更新(JPA、MySQL、Spring框架和Hibernate),java,mysql,hibernate,spring,jpa,Java,Mysql,Hibernate,Spring,Jpa,我有一个例子,在这个例子中,一个事务被启动,并且一路上(在代码中)会调用一个方法来启动一个新的事务。当内部事务完成时,数据将保留在数据库中,但从外部事务看不到数据 以下是代码片段 “doMoreStuff”方法更新数据库中的一些数据,之后“doSomething”方法需要查看更新后的数据,但事实并非如此。例如,“doMoreStuff”将布尔值从false设置为true,并将其持久化。“doSomething”方法仍然只看到值为false 有什么建议吗?嵌套事务-请使用-Propagation.

我有一个例子,在这个例子中,一个事务被启动,并且一路上(在代码中)会调用一个方法来启动一个新的事务。当内部事务完成时,数据将保留在数据库中,但从外部事务看不到数据

以下是代码片段

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


有什么建议吗?

嵌套事务-请使用-
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() {
    ...
}