2013-08-31 27 views
0

我正在開發將駐留在多臺計算機上的軟件。數據庫是共享的。 我需要每臺機器從數據庫中獲取一個唯一的資源(行)並鎖定它。如何鎖定計算機之間的共享數據庫資源

我的問題是我該如何照顧?因爲每臺機器讀取相同的行,並可能發生競爭。

基本上我認爲它一樣的線程,但不同的是,我不能分享它們之間的共享資源......

這是怎麼解決的?

謝謝!

+0

你是什麼意思通過鎖定行?只有相關的機器纔可以修改它? – Kurubaran

+0

是的。我想要一臺機器「捕獲」該行,做一些工作,但機器不能在該行上工作 – Himberjack

+0

爲什麼要首先鎖定機制?你有沒有考慮過使用交易?你可能會發現這個鏈接有用http://technet.microsoft.com/en-us/library/aa213039%28v=sql.80%29.aspx –

回答

0

我有一個類似的問題,我通過在數據庫級別編寫自己的鎖定程序來解決這個問題。

基本上我添加了一個名爲「SessionLock」的列,它是一個GUID。

每當我做一個需要鎖定的數據庫調用時,我使用存儲過程來模擬測試和設置(如果SessionLock不爲空,我使用更新,並檢查返回的行是否等於行的數量我要求被鎖定)。然後,我在行上執行一些工作,並在完成後解鎖它們。

現在數據庫本身有自己的鎖定,所以你可能不需要這麼多的複雜性。但是這樣你可以完全控制行。

0

在該表中添加一個可以存儲機器特定唯一值的附加列,例如機器名稱Environment.MachineName。每臺機器在第一次讀取表格時都會使用自己的機器名稱更新特定的行。通過這樣做,你可以確保每行只能被特定的機器改變。

  • 當第一次機器閱讀資源表,它會得到 這可是沒有一臺機器名稱的第一個記錄。 (防止從 過度排其他機器已鎖定)。

  • 它會更新該行的唯一列及其機器名稱。

  • 每當一臺機器想要更新一行時,請檢查該行和請求的機器的機器名稱是否相同 。

  • 所有操作完成後,清除機器名稱 特定行(釋放資源)。

+0

但是,我承諾他們不會互相重疊? – Himberjack

+0

你是什麼意思,通過壓倒對方?你能詳細說明你的要求嗎? – Kurubaran

+0

我有固定的「資源」。每個資源都是數據庫中的一行,每臺機器都可以捕獲,管理和釋放。但我不能有2臺機器在同一資源上工作。因此我需要以某種方式鎖定它 – Himberjack

0

所有嚴重的數據庫系統都有鎖定行和/或表的機制。在你自己實現一些homebrewn鎖之前,看看你的DBMS已經帶來了什麼。

你沒有提到你使用的DBMS,所以你將不得不自己使用Google搜索。 以「數據庫鎖」開頭,看看它會帶你到哪裏。

+0

MSSQL .......... – Himberjack