在没有@Version的情况下锁定JPA实体

时间:2015-09-21 05:26:02

标签: jpa locking entity version

ENV:

Java EE 7
JPA 2.1
EJB 3.1
Hibernate 4

最近我们遇到了其中一个表中的数据问题。点几点

  1. 该表映射到JPA实体
  2. 表格以及实体没有"版本"列/属性。
  3. 换句话说,此表没有可用的乐观锁定。在做RCA时,结果是并发数据修改问题。

    问题:

    1. 在@Version不可用/使用的情况下(换句话说是乐观锁定),使用单例存储库类是确保数据一致性的唯一选择吗?

    2. 在这种情况下悲观锁定怎么办?

    3. 我认为它是一个通用的用例,其中一个应用程序(特别是遗留)可以有一些带有版本列的表,有些则不行。是否有任何已知的模式来处理没有版本列的表/实体?

    4. 提前致谢, 勒凯什

1 个答案:

答案 0 :(得分:1)

JPA支持悲观锁定,如果您不能或不想使用乐观锁定,您可以自由使用它。

简而言之,EntityManager提供lock方法来锁定已检索到的实体,并且还重载了em.findem.merge,以及Query.setLockMode提供了提供锁定选项的方法在从DB检索数据时以原子方式应用锁。

但是,如果使用悲观锁定,您应该知道应该阻止死锁。解决问题的最佳方法是每次交易最多锁定一个实体。

您还可以考虑设置超时以尝试锁定实体,以便在实体已被锁定时您的事务不会等待很长时间。

更详细地,提供了对JPA的乐观和悲观锁定的非常可理解的解释here,包括READ和WRITE锁定模式之间的差异以及设置锁定超时。