0

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

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

 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=?

但只会进行第一次更新。

谢谢。

4

1 回答 1

1

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

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

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

于 2012-06-10T13:58:21.177 回答