2010-11-19 79 views
3

我试图用Spring和JPA/Hibernate实现一个悲观的离线锁。我的数据库中有一个锁表,用于存储所有锁(锁定的记录的ID,时间戳和用户)。 LockManager服务接口如下所示:悲观离线锁(Java,Spring)

public interface LockManager { 

    @Transactional(isolation=Isolation.SERIALIZABLE)  
    public Boolean TestAndGetLock(Application app, User user); 

    public void realeaseLock(Application app, User user); 
} 

TestAndGetLock方法首先测试记录上是否存在锁定。如果有,则返回true并终止。如果没有,则返回false并创建锁(在锁表中写入新的锁)。只有这样,webapp才会真正启动业务事务(在这种情况下,它显示了作为参数传递的应用程序的编辑表单)。

你能告诉我这个设计是否正确吗?所以这里

public boolean lock(Application app, User user); 

public void unlock(Application app, User user); 

的名字会更清楚:

+0

自定义隔离级别通常不适用于jpa/hibernate事务管理器。 – Bozho 2010-11-19 13:24:53

+0

他们为什么不呢?他们不支持? – 2010-11-19 13:39:22

回答

1

我会改正的设计。 行为将如下所示:客户端代码调用lock(),如果它锁定了smth,则返回true,否则返回false。 它纠正了你api中的一些误解:如果它成功锁定了smth,那为什么它返回false?另外,编写客户代码会更简单:

if (lockManager.lock()) { 
... 
} else { 
    throw new LockNotObtainedException() 
} 

第二种方法在我看来是可以的。