我正在尝试在Postgres数据库中使用Hibernate 3对JPA进行悲观锁定。但我无法使锁定超时 - 它似乎永远挂起。
据我所知,em2应该尝试获取锁并等待最多五秒钟(5000毫秒),然后抛出异常。但实际上,代码却出现了死锁。
如果我在两个不同的线程中运行此代码,则可以看到em2所在的thread2在em1释放锁后立即获取了锁。因此,锁定正在发生,只是从未超时。
我使用了Hibernate 3.6.10 Final(最新的Hibernate 3版本)和Postgres jdbc驱动程序9.2-1003.jdbc4(最新驱动程序)。我针对Postgres 8.4数据库运行。
我找到的所有文档都表明这应该有效。有什么建议吗?
谢谢, Alastair
以下是一个示例:
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毫秒),然后抛出异常。但实际上,代码却出现了死锁。
如果我在两个不同的线程中运行此代码,则可以看到em2所在的thread2在em1释放锁后立即获取了锁。因此,锁定正在发生,只是从未超时。
我使用了Hibernate 3.6.10 Final(最新的Hibernate 3版本)和Postgres jdbc驱动程序9.2-1003.jdbc4(最新驱动程序)。我针对Postgres 8.4数据库运行。
我找到的所有文档都表明这应该有效。有什么建议吗?
谢谢, Alastair