悲观离线锁(Java、Spring)

悲观离线锁(Java、Spring),java,hibernate,spring,jpa,transactions,Java,Hibernate,Spring,Jpa,Transactions,我试图使用Spring和JPA/Hibernate实现一个悲观的离线锁。我的数据库中有一个锁表,存储所有锁(被锁定记录的id、时间戳和用户)。LockManager服务界面如下所示: public interface LockManager { @Transactional(isolation=Isolation.SERIALIZABLE) public Boolean TestAndGetLock(Application app, User user); p

我试图使用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才能真正启动业务事务(在本例中,它显示作为参数传递的应用程序的编辑表单)


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

我会将设计更正为:

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()
}

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

自定义隔离级别通常不适用于jpa/hibernate事务管理器。为什么不呢?不支持吗?