2011-11-15 25 views
2

根據Hibernate中的Read LockMode文檔這是一個共享鎖。此鎖定模式中的對象是從當前事務的數據庫中讀取的,而不是從緩存中取出。在Hibernate中對Read和None LockMode進行說明?

 SessionFactory sessions = new Configuration().configure().buildSessionFactory(); 
    Session session = sessions.openSession(); 
    Transaction tx = null; 
     tx = session.beginTransaction(); 
     Person p1 = (Person)session. get(Person.class,1);//line 1 
     p1 = (Person)session. get(Person.class,1);//line 2 
     session. lock(p1, LockMode.READ);//line 3 
     p1 = (Person)session. get(Person.class,1);//line4 
     p1 = (Person)session. get(Person.class,1);//line 5 

現在,作爲每共享鎖定義保持共享鎖,以防止併發訪問由寫入與上面的代碼段,我提出的螺紋在第4行至保持(所以它已獲得在讀出鎖模式在這個時間點)。現在我試圖從另一個線程更新id爲1的人,它成功了。不知道爲什麼,因爲按照定義持股鎖來防止併發訪問由作家

爲已讀鎖定模式說,在這種鎖模式對象是從數據庫當前事務讀取,而不是被拉緩存。 Bt在我的代碼片段在第4行和第5行,它沒有從數據庫中獲得id爲1的行,它僅從會話獲得。爲什麼?

最後一個問題沒有鎖定模式。根據文檔不需要鎖。如果使用這種鎖定模式請求對象,如果需要從數據庫中實際讀取狀態,而不是從緩存中取出,則會獲得READ鎖定。如前所述,沒有獲得鎖,那麼爲什麼開發人員會獲得此鎖,因爲這將是默認設置。 對不對?

+0

你可以在後臺發佈** SQL查詢**嗎? – ManuPK

回答

2

現在我試圖從另一個線程更新id爲1的人,它 成功。不知道爲什麼,因爲按照定義保存共享鎖 防止由作家併發訪問

如何當一個線程1正要寫入數據庫和線程實體2將要讀取相同它的實體?他們中的任何一個都應該獲得讀取或寫入數據的鎖定。如果thread1獲得寫入鎖定,則線程2必須等待寫入完成。但是,如果線程2獲取讀鎖定,則線程1在進入和寫入數據時沒有問題。這是因爲當線程2以一致的狀態讀取記錄時。它只有在線程1寫入數據庫之後才變爲陳舊(儘管在版本化實體的情況下,從線程2寫入該對象將觸發陳舊狀態異常)。讀取鎖定是爲了防止不一致,並且不凍結記錄以供同一事務進一步更新。您可以使用寫入鎖來實現該行爲。

最後一個問題沒有鎖定模式。根據文件無鎖 需要。如果使用此鎖定模式請求對象,則必須獲取READ鎖 ,才能實際從數據庫讀取 的狀態,而不是從緩存中將其拉出。如上所述,獲取鎖定 後,爲什麼開發人員會獲得此鎖定,因爲這將是 的默認值。對?

爲了防止實體處於不一致狀態,再次獲取讀鎖。從緩存它不會是一個問題。開發人員在執行讀取操作時不需要指定讀取鎖定,它應該由持久性提供程序在內部進行管理。