我正在使用JPA 2.0的EclipseLink实现,它允许悲观锁定。我知道如何锁定实体,但是如何释放锁定呢?一开始我以为这一切都在事务中处理(换句话说,实体被锁定直到你提交事务),但事实并非如此。我尝试了快速的谷歌搜索(似乎这应该很明显),但我没有找到任何相关信息...
经过一些休息和早晨的测试,我相信我已经解决了我的问题。
所以锁实际上是在事务中被处理的。但是,当我测试我的代码时,我能够使用EntityManager.find(Class, key)
方法(没有指定锁定策略)检索到一个被锁定的行。
我错误地认为通过在一行上放置锁,该行就不能被读取。然而,我重新阅读了PESSIMISTIC_READ
和PESSIMISTIC_WRITE
的JPA定义,并注意到了我的问题:
PESSIMISTIC_READ - 实体在数据库上被锁定,防止其他事务获得PESSIMISTIC_WRITE锁。 PESSIMISTIC_WRITE - 实体在数据库上被锁定,防止其他事务获得PESSIMISTIC_READ或PESSIMISTIC_WRITE锁。
锁定并不一定阻止所有的读操作,它只是防止另一个事务在这一行上加上READ或WRITE锁
。