首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >org.hibernate.lockmode.pessimistic_write的行为

org.hibernate.lockmode.pessimistic_write的行为
EN

Stack Overflow用户
提问于 2014-12-11 05:54:52
回答 1查看 5.4K关注 0票数 3

我有两个服务在id = 1的同时被调用,Service1首先启动,然后是Service2。然而,Service2在Service1之前就完成了。在两个变量都完成之后,变量myClass的期望值应该是多少(假设初始颜色是“蓝色”和height= 5)?是吗

  1. myClass颜色为“绿色”,身高5。
  2. myClass身高12,颜色为“蓝色”
  3. 或者myClass的颜色是“绿色”和身高12?

以下是我的课程:

代码语言:javascript
复制
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,但我现在确定,这就是为什么我想确认它的行为。

EN

回答 1

Stack Overflow用户

发布于 2014-12-11 07:49:06

什么是锁?

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

锁的范围

锁的-A范围可能是

  • 整个数据库(数据库锁),
  • 桌子(桌子锁),
  • 行的集合(页锁)或
  • 单行(行锁)。

悲观中的不同锁模式

来自文档

代码语言:javascript
复制
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是在请求后自动获取的,这表示锁的当前持有人(即method2中的myClass )打算在锁定行的情况下更新实体。然后,它将禁止任何人(myClass in method1)读取、更新和删除实体。

希望一切都很清楚。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27416279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档