【发布时间】:2015-06-23 08:44:30
【问题描述】:
我有以下 JPA 实体:
@Entity(name="metrics")
public class Metrics {
@Id
private String metricId;
@Column
private long count;
public Metrics() {
count = 0;
}
我尝试像这样自动更新它:
//Begin transaction
Metrics result = em.find(Metrics.class, id);
if (result == null) {
result = new Metrics();
result.metricId = id;
result.count++;
em.persist(result);
} else {
result.count++;
em.merge(result);
}
//Commit transaction
但是由于某种原因,这似乎并没有使更新成为原子,我最终会在并发环境中丢失更新。我可以通过使用 @Version 使用 Hibernate 实现乐观锁定来解决这个问题,但我有点惊讶这是必需的。
为什么即使有事务,上述代码也会丢失更新?
【问题讨论】:
标签: java oracle hibernate jpa transactions