我有两个服务在id = 1的同时被调用,Service1首先启动,然后是Service2。然而,Service2在Service1之前就完成了。在两个变量都完成之后,变量myClass的期望值应该是多少(假设初始颜色是“蓝色”和height= 5)?是吗
以下是我的课程:
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,但我现在确定,这就是为什么我想确认它的行为。
发布于 2014-12-11 07:49:06
什么是锁?
-Pessimistic锁定是一种方法,其中一个实体被锁定,直到该实体的事务完成。锁可以限制或阻止其他用户表单使用数据库中的该实体。
锁的范围
锁的-A范围可能是
悲观中的不同锁模式
来自文档。
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)读取、更新和删除实体。
希望一切都很清楚。
https://stackoverflow.com/questions/27416279
复制相似问题