gpt4 book ai didi

java - 更改一笔交易中的实体字段

转载 作者:行者123 更新时间:2023-12-01 15:20:39 25 4
gpt4 key购买 nike

在我的应用程序中,我有一个需要一些时间(30 秒 - 5 分钟)的流程,在此期间通过 JPA 操作数据库。

我的问题是我想将进程的状态设置为其数据库实体:

 void runProcess(Process process) {
process.setState("Started.");
em.merge(process);

... db manipulations

process.setState("First phase finished.");
em.merge(process);

... db manipulations

process.setState("Process finished.");
em.merge(process);
}

问题是只发生第一次更新,而其他更新则被忽略。

我没有收到任何错误和 Hibernate 日志,我可以看到进程更新三次:

 Hibernate: update process set state=? where id=?

但只会进行第一次更新。

谢谢。

最佳答案

对实体所做的更改是在内存中进行的,并且仅在刷新时(通常在事务结束时)写入数据库。

即使在事务结束之前进行刷新,或者在每次进程状态更新后刷新,其他并发事务也很有可能看不到新状态,因为事务彼此隔离,并且大多数情况下,默认隔离级别是 READ_COMMITTED(这意味着其他事务只有在提交后才能看到更改)。

如果想让进程状态明确写入数据库,则需要在单独的事务中写入此状态。

关于java - 更改一笔交易中的实体字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10969238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com