我正在使用 JPA 2.0 的 EclipseLink 实现,它允许悲观锁定。我知道如何锁定实体,但如何释放锁定?起初我认为这一切都在事务中处理(换句话说,实体在您提交事务之前被锁定),但似乎并非如此。
我尝试了一个快速的谷歌搜索(似乎这应该很明显),但我没有找到任何东西......
我正在使用 JPA 2.0 的 EclipseLink 实现,它允许悲观锁定。我知道如何锁定实体,但如何释放锁定?起初我认为这一切都在事务中处理(换句话说,实体在您提交事务之前被锁定),但似乎并非如此。
我尝试了一个快速的谷歌搜索(似乎这应该很明显),但我没有找到任何东西......
睡了一会儿……早上又做了一些测试,我相信我已经找到了我的问题。
所以锁其实是taken care of within a transaction
。但是,当我测试我的代码时,我能够使用该EntityManager.find(Class, key)
方法检索锁定的行(未指定锁定策略)。
我错误地认为通过在一行上加锁,就无法读取该行,句号。但是,我重新阅读了 and 的 JPA 定义PESSIMISTIC_READ
并PESSIMISTIC_WRITE
注意到了我的问题:
PESSIMISTIC_READ - 实体在数据库上被锁定,防止任何其他事务获取 PESSIMISTIC_WRITE 锁。 PESSIMISTIC_WRITE - 实体在数据库上被锁定,防止任何其他事务获取 PESSIMISTIC_READ 或 PESSIMISTIC_WRITE 锁。
锁不一定会阻止所有读取,它只是阻止另一个事务将 a放在READ or WRITE lock
行上。