gpt4 book ai didi

java - 我需要什么 Hibernate LockMode 来读取和更新对象,同时防止其他人这样做?

转载 作者:行者123 更新时间:2023-11-30 07:14:00 24 4
gpt4 key购买 nike

在下面的代码示例中:

   Session session = getSessionFactory().openSession();

MyObject currentState = (MyObject)
session.get(MyObject.class, id, new LockOptions(LockMode.???));

if (!statusToUpdateTo.equals(currentState.getStatus())) {
tx = session.beginTransaction();

currentState.setStatus(statusToUpdateTo);
session.save(currentState);

tx.commit();
}

session.close();

正如您可能希望从代码中解释的那样,我们的想法是检查我们的商店并找到具有给定 ID 的对象,然后将其更新为给定状态。如果我们发现对象已经处于我们想要更新的状态,我们就放弃做任何事情。否则,我们更新状态并将其保存回商店。

我担心的是,如果这些请求中有几个同时通过,并且都尝试读取和更新同一个对象怎么办?通过 doco 来看,Hibernate 似乎“通常会自动获得正确的锁定级别”。 (LockMode.class)但我仍然热衷于确保只有一件事可以读取对象,做出需要更新它的决定,然后更新它 - 没有任何其他线程对同一个数据库条目执行相同的操作。

根据 LockMode 类,我认为 PESSIMISTIC_WRITE 是我所追求的,但似乎无法找到证实这一点的文档资源。有谁能为我确认这一点,并且上面的代码会做我想要的吗?

最佳答案

所以我在我的原始代码中注意到,在 session 关闭时,数据库上仍然保留着一个锁,因为当对它们调用 tx.commit() 时,删除我插入的行的后续调用没有完成。

添加以下 else block 后,我的测试通过了,我推断这意味着锁已被释放(因为现在正在清理这些行)。

   Session session = getSessionFactory().openSession();

MyObject currentState = (MyObject)
session.get(MyObject.class, id,
new LockOptions(LockMode.PESSIMISTIC_WRITE));

if (!statusToUpdateTo.equals(currentState.getStatus())) {
tx = session.beginTransaction();

currentState.setStatus(statusToUpdateTo);
session.save(currentState);

tx.commit();
} else {
// Seems to clear lock
tx = session.beginTransaction();
tx.rollback();
}

session.close();

对我来说,这显然反射(reflect)了我对 Hibernate 的锁定机制缺乏了解,但使用 session.get(...) 或 session.load(...) 获得锁定,然后不是使用 session 本身释放锁,而是仅通过创建事务和提交/回滚来释放锁。

当然,我可能只是误解了观察到的行为:)

关于java - 我需要什么 Hibernate LockMode 来读取和更新对象,同时防止其他人这样做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18777031/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com