2016-08-01 85 views
0

我正在尋找一種方法來保存並立即鎖定數據庫上的實體,以避免其他線程在線程創建者結束之前訪問該實體。
我使用Hibernate 4.3.11和Spring 4.2.5。
在此先感謝。用Hibernate保存並鎖定實體

回答

0

一種可能的方法應該是將事務級別提高爲可序列化。 該級別確保數據被鎖定,直到未在其他事務中使用。

+0

謝謝您的回答。這樣整個表將被鎖定。我只想鎖定新的實體。 – nuno

+0

隔離級別越高,其性能越低。 –

0

雖然鎖定模式 - LockMode.WRITE - 但隨着文檔狀態

當對象被更新或插入得到的寫鎖。這 鎖定模式僅用於內部使用,不是一個有效的模式,負載() 或鎖()(如果指定寫的是這兩個拋出異常)..

如果它只是你只插入行,那麼你不能專門鎖定使用hibernate的數據庫行,因爲行尚未提交。 當你的代碼(休眠或沒有)在數據庫中插入行並且尚未提交時 - 有事務鎖被持有,在事務提交時被釋放。鎖的性質和內部發生的方式是數據庫特定的。但是,如果你有興趣在鎖定一些行(已經存在),那麼你可以 使用

session.get(TestEntity.class, 1, LockMode.PESSIMISTIC_WRITE); 

這將持有悲觀鎖查詢到的數據(通常通過發出SELECT .... FOR UPDATE)的持續時間的事務,並且沒有其他線程/事務可以修改已經進行了鎖定的數據。

0

Hibernate提供了樂觀和悲觀兩種類型的鎖。它直線前進。

1)樂觀用途版本在那裏它會在數據庫中的版本列,並檢查它更新之前,否則拋出悲觀異常

2)就像一個數據庫中的一些事情處理上該行的鎖定並且在操作完成後會得到釋放,有幾個選項都存在這同樣是怎麼樣,你想像這樣讀鎖,寫鎖

https://docs.jboss.org/hibernate/orm/4.0/devguide/en-US/html/ch05.html

相關問題