从JPA文档中,如果没有人在实体上持有PESSIMISTIC_WRITE锁,则可以获取对实体的PESSIMISTIC_READ锁定。但是,当我使用OpenJPA 2.0.0,WebSphere和MSSQL(以及DB2)进行测试时,似乎2个服务无法同时获取同一实体上的PESSIMISTIC_READ锁。
此代码(在ConfigEJB中)用于锁定实体:
ConfigEntity configEntity = this.getEntityById(1); // successfully get the entity
this.entityManager.lock(configEntity, LockModeType.PESSIMISTIC_READ);
调用了2个ConfigEJB实例。第一个实例可以成功获取锁。但是,第二个实例无法获得锁定,并且在第一个实例完成其事务之前被阻止(我希望它成功获得锁定)。
有没有人遇到过这个问题?或者这是JPA的预期行为?如何让服务获得PESSIMISTIC_READ正确锁定?
答案 0 :(得分:0)
未在参考文献中找到,但Pro JPA2说:
某些数据库支持锁定机制,无需获取写锁即可获得可重复的读隔离。当不期望写入实体时,PESSIMISTIC_READ模式可用于悲观地实现可重复的读取语义。事实上不会经常遇到这种情况,加上提供商使用悲观写锁实现它的限制,导致我们说这种模式不容易拾起并常用。
所以,您的数据库提供程序似乎用PESSIMISTIC_WRITE替换PESSIMISTIC_READ