gpt4 book ai didi

java - org.hibernate.lockmode.pessimistic_write 的行为

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:11:30 29 4
gpt4 key购买 nike

我有两个服务几乎同时被调用,id = 1。Service1 首先启动,然后是 Service2。但是,Service2 在 Service1 之前先完成。完成后变量 myClass 的预期值应该是多少(假设初始颜色为“蓝色”且高度 = 5)?是吗

  1. myClass 的颜色为“GREEN”,高度为 5
  2. myClass 的高度为 12,颜色为“蓝色”
  3. 或者 myClass 的颜色为“GREEN”且高度为 12?

这是我的类(class):

class Service1{

private MyDao myDao;

public void method1(Integer id){
MyClass myClass = myDao.get(MyClass.class,id,LockMode.PESSIMISTIC_WRITE);
//change myClass
myClass.setColor("GREEN");
update(myClass);
}
}

class Service2{

private MyDao myDao;

public void method2(Integer id){
MyClass myClass = myDao.get(MyClass.class,id,LockMode.PESSIMISTIC_WRITE);
//different change in change myClass
myClass.setHeight(12);
update(myClass);
}
}

class MyDao{
public Object get(Class clazz, Serializable id, LockMode mode){
return getHibernateTemplate().get(clazz,id,mode);

}
}

在这里,我对 PESSIMISTIC_WRITE 的行为特别感兴趣。我的实际代码是用 spring 编写的,我正在跟踪一个未调用更新的特定问题。我怀疑这是由于 PESSIMISTIC_WRITE 造成的,但我现在确定这就是我想要确认其行为的原因。

最佳答案

什么是悲观锁?

- 悲观锁定是一种锁定实体直到该实体的事务完成的方法。锁可以限制或阻止其他用户表单使用数据库中的该实体。

锁定范围
-锁的范围可能是

  • 整个数据库(数据库锁),

  • 一个表(表锁),

  • 一组行(页面锁)或

  • 单行(行锁)。


悲观锁模式不同

来自 docs .

LockMode.WRITE is acquired automatically when Hibernate updates or inserts a row.
LockMode.UPGRADE can be acquired upon explicit user request using SELECT ... FOR UPDATE on databases which support that syntax.
LockMode.UPGRADE_NOWAIT can be acquired upon explicit user request using a SELECT ... FOR UPDATE NOWAIT under Oracle.
LockMode.READ is acquired automatically when Hibernate reads data under Repeatable Read or Serializable isolation level. It can be re-acquired by explicit user request.
LockMode.NONE represents the absence of a lock. All objects switch to this lock mode at the end of a Transaction. Objects associated with the session via a call to update() or saveOrUpdate() also start out in this lock mode.


现在在您的情况下,如果它首先执行,则 2 号将是值。然后其他更新将被禁止。请记住 LockMode.WRITE 是在请求​​后自动获取的,这表明当前锁的持有者(方法 2 中的 myClass)打算在您锁定行的情况下更新实体.然后它将禁止任何人(方法 1 中的 myClass)读取、更新和删除该实体。

希望一切都清楚。

关于java - org.hibernate.lockmode.pessimistic_write 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27416279/

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