在一个事务中更改实体字段

时间:2012-06-10 13:51:39

标签: java hibernate jpa transactions

在我的应用程序中,我有一个需要一些时间(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=?

但只会进行第一次更新。

感谢。

1 个答案:

答案 0 :(得分:1)

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

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

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