2011-11-17 239 views
3

我正在爲教練和球員製作一個體育俱樂部的數據庫。球員能夠創造自己,教練也能夠創造和更新球員。版本控制數據庫?

如何製作編輯部分,以便當時只有一位教練可以更新球員信息。 我在考慮使用版本控制。在每個表中創建版本行並在編輯時更新它,以確保當時只有一個人可以編輯它。

有關如何做到這一點的任何其他建議?

回答

1

是的。你的建議是可行的。

假設您將數據庫中id = 1和version = 1的記錄加載到應用程序中。然後您修改它。在發佈UPDATE SQL以更新更改時,您應該更新幷包含對版本列的檢查。

更新SQL應該像這樣:

update ITEM set REMARK="SOME UPDATE REMARK!!" , VERSION= @origianl_vesrion +1 
where ITEM_ID=1 and [email protected]_vesrion 

注:@origianl_vesrion是當它被加載到你的應用程序目前的版本列的值)

如果另一個事務的更新和提交在您提交之前的同一行中,發佈的SQL 的更新行數將爲零,因爲VERSION列由該事務增加並且不會再等於1。

因此,如果更新行數是零,則可以顯示錯誤消息,說什麼「有人更改相同的記錄太多,請重試」

0

創建一個包含教練ID和玩家ID的'lock'表。編輯時,檢查表格中是否存在兩個ID,並據此採取行動。編輯完成後,您可以刪除此條目。

+0

如果有鎖,你也有死鎖.. – duedl0r

1

從概念上講,你有3個選擇。

鎖定

你建立一種機制,以 「鎖定」 的記載。這意味着沒有其他用戶可以在打開它進行編輯時獲得該記錄的寫入權限。實際上,這是非常可怕的 - 正如duedl0r所說,失敗模式是過高的,對於您的應用程序來說,這可能是不值得的。

比較

這是最常見的模式,我已經遇到。當從數據庫中檢索記錄時,在編輯之前,您會找到一種識別該記錄的方法 - 通常通過將所有字段散列在一起。一旦用戶完成其更改,就可以從數據庫中檢索相同的記錄,將其與原始快照的(哈希值)進行比較,並在此期間記錄發生更改時通知用戶。

忽略它,或者設計走

假設你正在處理的併發用戶的數量非常少的可能性,這種情況發生的風險可以忽略不計,所以你可以選擇不處理它。或者,您可以設計應用程序,以便教練只能修改自己的球員。

你可能也想建立一些邏輯來阻止教練創造重複的球員 - 這非常棘手。 「彼得邁克爾史密斯」與「皮特史密斯」是同一名球員嗎?