ENV:
Java EE 7
JPA 2.1
EJB 3.1
Hibernate 4
最近我们遇到了其中一个表中的数据问题。点几点
换句话说,此表没有可用的乐观锁定。在做RCA时,结果是并发数据修改问题。
问题:
在@Version不可用/使用的情况下(换句话说是乐观锁定),使用单例存储库类是确保数据一致性的唯一选择吗?
在这种情况下悲观锁定怎么办?
我认为它是一个通用的用例,其中一个应用程序(特别是遗留)可以有一些带有版本列的表,有些则不行。是否有任何已知的模式来处理没有版本列的表/实体?
提前致谢, 勒凯什
答案 0 :(得分:1)
JPA支持悲观锁定,如果您不能或不想使用乐观锁定,您可以自由使用它。
简而言之,EntityManager提供lock
方法来锁定已检索到的实体,并且还重载了em.find
和em.merge
,以及Query.setLockMode
提供了提供锁定选项的方法在从DB检索数据时以原子方式应用锁。
但是,如果使用悲观锁定,您应该知道应该阻止死锁。解决问题的最佳方法是每次交易最多锁定一个实体。
您还可以考虑设置超时以尝试锁定实体,以便在实体已被锁定时您的事务不会等待很长时间。
更详细地,提供了对JPA的乐观和悲观锁定的非常可理解的解释here,包括READ和WRITE锁定模式之间的差异以及设置锁定超时。