2011-11-28 30 views
0

按照LockMode.READ :-此鎖定模式中的對象是從當前事務的數據庫中讀取的,而不是從緩存中取出。問題我在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行,我看到多了一個查詢被解僱是選擇ID從MyProject1.Person其中id =?但它不會觸發人員對於id 1的查詢,並且不會在第2行和第3行中獲取更新人員值。

回答

0

從數據庫中再次讀取它是完全正確的。行爲與Javadoc一致。在您的代碼中,Line1和Line3在同一個交易中,所以「在當前交易」仍然成立。

+0

嗨mikko。看到我編輯的帖子。即使我正在進入另一個事務,即使LockMode.read也不會從數據庫獲取值 –