如何解决JPA中的乐观并发更新案例

时间:2013-09-13 03:41:50

标签: java jpa

有没有办法知道JPA中何时出现乐观并发问题以及如何解决它?

问题描述: 在我的项目中,当我想更新数据库中的数据但其他用户正在使用它时。在这种情况下,我想获得DB_STATUS或异常,这意味着"其他用户正在使用.."。所以我想跳过更新DB。

1 个答案:

答案 0 :(得分:0)

持久性提供程序使用Version字段或属性来执行乐观锁定。它在实体实例上执行生命周期操作的过程中由持久性提供程序访问和/或设置。如果实体具有使用Version mapping

映射的属性或字段,则会自动启用乐观锁定

在您的实体中定义version属性:

@Version
private long version;

以及实体的数据库表中相应的version字段。

假设您已加载id = 123且版本= 1的实体。一旦事务完成,实体状态将变为detached状态。

您对detached状态的实体进行了更改。您可以使用EntityManager.merge()使这些更改持久化。由于它是detached实例,Hibernate将发出类似于此的SQL更新:

update ENTITY set ... , VERSION=2 where ID=123 and VERSION=1

如果另一个应用程序事务在加载后更新了相同的ENTITY,则VERSION列将不包含值1,并且不会更新该行。您将收到OptimisticLockException,并且该交易将被标记为回滚。您可以捕获异常并通知用户有关陈旧数据的信息。

合并操作在合并实体时检查version属性,如果发现被合并的对象是实体的陈旧副本,则抛出OptimisticLockException。自实体分离后实体已更新。