2010-08-23 74 views
0

我想在我的Oracle數據庫中有一個表,其行作爲鎖。該表將有一列,一個varchar,我的客戶端(基於JDBC的Java進程)將運行語句來獲取和釋放鎖。我可以使用普通SQL在我的數據庫(Oracle)中有一個互斥表嗎?

acquire語句應檢查是否存在具有給定值的行,如果不存在則插入。該聲明應該以某種方式告訴調用者該行是否是免費的。

釋放語句應該通過刪除行來釋放鎖。

發佈聲明很簡單,但我的獲得聲明應該是什麼樣子?

+1

爲什麼要這樣做?這聽起來像重新發明了輪子,你也可以應用常規的悲觀或樂觀鎖定。 – 2010-08-23 10:54:39

回答

1

您可以在lockname上定義主鍵唯一索引。客戶端會嘗試:

INSERT Locks 
     (lockname) 
VALUES 'MyLock' 

如果這會產生一個主鍵衝突,客戶端沒有在獲取鎖成功。

+0

這裏的一個弱點是,如果因爲某種錯誤而無法運行(釋放語句)從不運行,會發生什麼?然後,您必須手動刪除鎖定條目。所以你需要爲此提供某種清理或超時解決方案。 – Wolf5 2014-07-10 07:41:49

5

爲此,我建議您使用DBMS_LOCK。在引擎蓋下,它幾乎完成了你的建議。

DBMS_LOCK package

+0

已投票。 DBMS_LOCK是一個更安全的選擇。使用單行手動執行操作很容易,直到變得困難 - 如果客戶端在刪除行之前丟失連接,會發生什麼?有沒有未被捕獲的異常可能繞過發佈的潛在途徑?如果兩個進程都執行測試來檢查鎖定,發現不存在鎖定,然後繼續創建鎖定(我已經看到這種情況發生在現實生活中,那麼會發生什麼情況 - 如果每隔幾天就會發生一次,每天有數萬筆交易)。 – JulesLt 2010-08-23 12:00:10

+3

「如果兩個進程都執行測試以檢查鎖,發現不存在鎖,然後繼續創建鎖,會發生什麼情況。」你不會這樣寫。相反,您嘗試創建鎖並在發生異常時捕獲異常。 – 2010-08-23 23:10:18

相關問題