2个服务无法获取同一实体的PESSIMISTIC_READ锁定

时间:2014-03-25 05:02:29

标签: jpa ejb

从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正确锁定?

1 个答案:

答案 0 :(得分:0)

未在参考文献中找到,但Pro JPA2说:

某些数据库支持锁定机制,无需获取写锁即可获得可重复的读隔离。当不期望写入实体时,PESSIMISTIC_READ模式可用于悲观地实现可重复的读取语义。事实上不会经常遇到这种情况,加上提供商使用悲观写锁实现它的限制,导致我们说这种模式不容易拾起并常用。

所以,您的数据库提供程序似乎用PESSIMISTIC_WRITE替换PESSIMISTIC_READ