2

我們的應用程序主要使用Hibernate的版本支持進行樂觀鎖定。我們計劃在一個特定的場景中實施悲觀鎖定。我對悲觀鎖定沒有太多經驗,所以請原諒這個問題聽起來天真。如何在Oracle中回滾/超時「選擇更新」鎖?

當用戶顯示更新條目的意向時 - 我們使用「select for update」鎖定相應的DB行。現在,如果這個用戶花費很長時間來提交他的更改在鎖定後忘記了它,我們如何使用某種超時/回滾機制解鎖此鎖定?因此該行不會長時間保持鎖定狀態,並且不允許所有其他用戶進行編輯。

我懷疑這是否會在我們正在使用的Weblogic-JTA-Spring事務機制中處理 - 我們已經有了30分鐘的事務超時。 (??)

因此,這個回滾應該直接在Oracle級別處理。如果是,那麼如何?請建議最好的方式來處理這種情況,這樣鎖不會留下太久。

+0

配置。這個級別的會話超時是多少? – fge

+0

好的我做了一些搜索,得到這個:SELECT PROFILE,LIMIT FROM DBA_PROFILES WHERE RESOURCE_NAME ='IDLE_TIME';我們的數據庫中的哪一個說UNLIMITED - 我認爲這意味着沒有會話超時。對? – haps10

+0

您可以將回調函數的等價物傳遞給您的方法,以輪詢執行時間。一旦它達到x秒你回滾會議......或類似的東西。 – Ben

回答

2

只有在交易結束時,鎖纔會被釋放。當向數據庫發出明確的commitrollback或數據庫會話終止時(隱含的rollback),交易將結束。如果您的中間層已經設置爲回滾所有打開時間超過30分鐘的事務,那麼釋放鎖就足夠了。

但是,如果您有一個Java應用程序在Weblogic應用程序服務器中運行,那麼它會讓我感到悲觀鎖定非常適合。首先,我假設你在中間層使用連接池。如果是這種情況,那麼連接池中的一個數據庫連接將需要由中間層持有的事務長度(在這種情況下長達30分鐘)。但是,允許一個會話持續打開一個特定的數據庫會話很長一段時間會打破擁有連接池的目的。通常,數十個應用程序會話可以共享來自連接池的單個連接 - 如果您要允許悲觀鎖定,那麼現在您正在爲這些會話強制應用程序會話和數據庫會話之間的1:1關係。

+0

謝謝。是的,我沒有成功,我們不能兩全其美。讓Weblogic管理我們的jdbc會話,然後挑出一些來管理我們自己的悲觀鎖定。 – haps10

0

有很多情況下,樂觀鎖定不能取代悲觀鎖定。鎖定超時在數據庫中處理。請參閱本網頁有關。如果會話關閉在數據庫級別,那麼所有的行鎖被丟棄如何在Oracle

Can Oracle's default object lock timeout be changed?