我正在尝试通过 Hibernate 3 对 Postgres 数据库使用 JPA 中的悲观锁定。我无法让锁超时 - 它似乎永远挂起。
这是一个例子:
EntityManagerFactory factory;
// (initialise the factory )
EntityManager em1 = factory.createEntityManager();
EntityManager em2 = factory.createEntityManager();
// em1 gets a lock
EntityTransaction transaction1 = em1.getTransaction();
transaction1.begin();
MyObject object1 = em1.find( MyObject.class, 1, LockModeType.PESSIMISTIC_READ );
// em2 tries for a lock
Map<String,Object> timeoutProperties = new HashMap<String,Object>();
timeoutProperties.put("javax.persistence.lock.timeout", 5000);
EntityTransaction transaction2 = em2.getTransaction();
transaction2.begin();
MyObject object2 = em2.find( MyObject.class, 1, LockModeType.PESSIMISTIC_READ, timeoutProperties );
// After five seconds I expect em2 to bail out, but it never does.
transaction1.rollback();
transaction2.rollback();
据我了解,em2 应该尝试最多五秒钟(5000 毫秒)来获取锁,然后应该抛出异常。相反,代码会陷入僵局。
如果我在两个不同的线程中运行它,那么我会看到 thread2(带有 em2)在 thread1(em1)释放它时立即获得锁。所以锁定正在发生,只是永远不会超时。
我使用 PESSIMISTIC_WRITE 和任何超时值(2ms、0ms 'NO WAIT')等都得到了相同的效果。
我正在使用 Hibernate 3.6.10 Final(最新的 Hibernate 3 版本)和 Postgres jdbc 驱动程序 9.2-1003.jdbc4(最新的驱动程序)。我正在针对 Postgres 8.4 数据库运行。
我发现的所有文档都表明这应该可行。有任何想法吗?
谢谢,阿拉斯泰尔