在我的应用程序中,我有一个需要一些时间(30s - 5mins)的过程,并且在此期间通过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=?
但只会进行第一次更新。
感谢。
答案 0 :(得分:1)
对实体所做的更改是在内存中进行的,并且只在刷新时(通常在事务结束时)写入数据库。
即使在事务结束之前发生了波动,或者在每次进程状态更新后刷新,其他并发事务很有可能无法看到新状态,因为事务彼此隔离,并且大多数情况下,默认隔离级别是READ_COMMITTED(这意味着其他事务只有在提交后才会看到更改)。
如果要将进程状态明确写入数据库,则需要在单独的事务中写入此状态。