悲观的离线锁(Java,Spring)

时间:2010-11-19 13:20:55

标签: java hibernate spring jpa transactions

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

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才真正启动业务事务(在这种情况下,它显示了作为参数传递的应用程序的编辑表单)。

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

1 个答案:

答案 0 :(得分:1)

我会将设计更正为:

public boolean lock(Application app, User user);

public void unlock(Application app, User user);

所以这里的名字会更清楚。 行为如下:客户端代码调用lock(),如果锁定了smth,则返回true,否则返回false。 它纠正了你的api中的一些误解:如果它成功锁定了smth,那么为什么它会返回false?此外,编写客户端代码会更简单:

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

我认为第二种方法还可以。