我被要求實施「訪問策略」,以限制直接連接到應用程序(不是web應用程序)的應用程序的併發執行的數量數據庫。限制使用數據庫的應用程序進程的併發執行
應用程序在多臺機器上運行,如果多於一個用戶試圖調用該進程,則在給定時間只允許執行一次執行,另一次必須返回錯誤消息(不等待第一次執行結束)。
雖然我使用的是Java/Postgres,這是一個普遍的問題。
鑑於我有幾臺機器運行相同的應用程序,我能想到的最簡單的解決方案是實現某種「數據庫標誌」。
喜歡的東西檢查過程當前是否處於活動:
SELECT Active FROM Process
如果它是積極的,返回一個「併發訪問策略錯誤」。如果不是,將其激活:
UPDATE Process SET Active = 'Y'
一旦執行完畢,只需更新活動標誌:
UPDATE Process SET Active = 'N'
不過,我遇到了一個大問題:
- 如果我不要使用數據庫事務來更改活動標誌,並且應用程序被終止,活動標誌將永遠保持Y值。
- 如果我使用數據庫事務,第一點就解決了。但是,主機中的活動標誌(從N到Y)的更改僅在提交後纔可見,因此其他主機將永遠不會以Y值讀取活動狀態,因此無論如何都會執行。
任何想法?
只需稍加思考:您可以在單獨的事務中設置標誌(可能結合顯式鎖定),或者您可以查看對某種羣集範圍鎖定進行榛樹播放(儘管這可能會對您的應用程序造成影響)。 – Marvin
與問題沒有直接關係,但是您可以使用'INSERT'而不是'UPDATE'來獲益。當第一個用戶調用該進程時,應該在數據庫中插入一個新行。當第二個用戶調用該進程時,他使用相同主鍵的'INSERT'應該失敗。 – CKing