锁定实体

托马斯·施密特

我目前在锁定JPA中的实体时遇到问题。我有一个数据库中的几个实体的列表。对于每个元素,都有一个编辑按钮,可加载用于编辑该条目的视图。每次客户端尝试编辑条目时,我都想检查实体是否被锁定,从而阻止客户端甚至加载实体的编辑掩码。

我加载实体的方法:

[...]
mail = (EMailKonto) query.getSingleResult();
System.out.println(getLock(mail).toString());
setLock(mail, LockModeType.PESSIMISTIC_WRITE);
System.out.println(getLock(mail).toString());

调用的方法:

public void setLock(T entity, LockModeType lock) 
{
getEntityManager().lock(entity, lock);
}

public LockModeType getLock(T entity)
{
    return getEntityManager().getLockMode(entity);
}

因为没有应用锁,所以发生的是第一个syso打印NONE。然后设置锁,第二个syso打印PESSIMISTIC_WRITE。当我刷新页面或使用其他选项卡/浏览器并单击同一实体的编辑按钮时,第一个syso应该打印PESSIMISTIC_WRITE,因为我从未删除过锁,但它再次打印了NONE。你们可以帮我了解如何实现这种功能吗?

问候

达努比亚水手

从技术上讲,悲观锁是通过发出SELECT ... FOR UPDATE命令来实现的,该命令将锁定当前事务的行,从而使SELECT ... FOR UPDATE其他事务以及其他事务中的UPDATE都将失败。

当事务结束时,所有事务级别的锁都被释放,因此这种实现对于您所需的功能不可行,因为只要客户端正在编辑行,就需要保留事务。可以在繁重的客户端中实现(尽管设计很糟糕),但是在Web应用程序中却不切实际,因为如果客户端关闭浏览器,甚至没有反馈。

您需要通过在单独的表中存储“锁”来在业务级别上手动实现和管理锁。事务级(悲观)锁旨在用作业务级锁。它们是旨在声明事务一致性的低级机制。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章