我正在尝试使用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才真正启动业务事务(在这种情况下,它显示了作为参数传递的应用程序的编辑表单)。
你能告诉我这个设计是否正确吗?
答案 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()
}
我认为第二种方法还可以。