问题我在休眠期间的LockMode.READ期间得到了什么?

时间:2011-11-28 16:51:59

标签: hibernate

根据LockMode.READ: - 此锁定模式下的对象是从当前事务中的数据库中读取的,而不是从缓存中提取的。

所以我尝试了下面的代码片段

Session session = sessions.openSession();
tx = session.beginTransaction();
person = (Person)session. get(Person.class,1);//Line1
session.lock(person, LockMode.READ);//Line2
person = (Person)session. get(Person.class,1);//Line3

在第1行数据库查询被解雇,因为我第一次在会议中找到了人。

根据上面LockMode.READ的定义,我预计数据库查询也会在第3行触发。但它没有 - 为什么?

仅用于在第1行触发的信息查询

Select person0_.id as id0_1_, person0_.cname as cname0_1_, 
person0_.addressId1 as addressId3_0_1_, address1_.id as id1_0_, address1_.personId 
as personId1_0_, address1_.addressLine1 as addressL3_1_0_ from MyProject1.Person 
person0_, MyProject1.Address address1_ where person0_.addressId1=address1_.id(+) 
and person0_.id=?

修改

Session session = sessions.openSession();
tx = session.beginTransaction();
person = (Person)session. get(Person.class,1);
tx.commit();
session.close();



Session session = sessions.openSession();
tx = session.beginTransaction();
person = (Person)session. get(Person.class,1);//Line1
session.lock(person, LockMode.READ);//Line2
person = (Person)session. get(Person.class,1);//Line3
tx.commit();
session.close();

现在在第2行,我看到另外一个查询被解雇这是来自MyProject1.Person的选择ID,其中id =?但是它不会触发id为1的查询并且不会更新人不在第2行第3行

1 个答案:

答案 0 :(得分:0)

不再从数据库中读取它是完全可以的。行为与Javadoc一致。在您的代码中,Line1和Line3属于同一个事务,因此“在当前事务中”仍然存在。