根据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行
答案 0 :(得分:0)
不再从数据库中读取它是完全可以的。行为与Javadoc一致。在您的代码中,Line1和Line3属于同一个事务,因此“在当前事务中”仍然存在。