2013-09-21 62 views
1

我有一個主鍵是數字的表不是順序的。 公司的政策是註冊可用ID值較低的新行。 I.E.在插入之前鎖定ID - Oracle 10G

table.ID = [11,13,14,16,17] 
min(table.ID) = 12 

我有一個算法,給我最低的可用。我想知道如何在插入前防止此ID被其他人使用。

數據庫能做到嗎?或者它會是編程語言?

謝謝。

+0

我不知道「BD」在這裏應該代表什麼。除了軟件之外,它將如何完成?你在尋找一個硬件解決方案? –

回答

1

公司政策極其短視。除非公司的目標是構建不擴展的應用程序,並且公司對性能毫不關心。

如果你真的想這樣做,你需要序列化所有與這個表相關的事務 - 本質上將你的功能強大的服務器變成一個單線程的單用戶低端機器。有許多方法可以做到這一點。最簡單的(雖然不是簡單的)方法是在行的SELECT ... FOR UPDATE的最大關鍵字小於您要插入的新關鍵字(在這種情況下爲11)。一旦你獲得鎖定,你需要重新確認12是空的。如果是的話,你可以用id來插入12行。否則,你需要重新啓動進程來尋找新的密鑰,並試圖用一個小於該密鑰的id來鎖定該行。當你的事務提交時,鎖將被釋放,並且下一個被阻塞的等待鎖的會話將能夠處理。這假定您可以控制每個嘗試向該表中插入數據的進程,並且它們都將實現完全相同的邏輯。如果您允許交易跨越等待人類輸入,它將鎖定系統,因爲人類將不可避免地與行鎖定一起吃午餐。所有這些序列化都會大大降低應用程序的可伸縮性。

我強烈地鼓勵你推動反對荒謬的「要求」,而不是實施這個可怕的事情。