2015-01-17 62 views
0

我有這些表:併發核心價值表

CO_KEYVALUE

co_keyvalueid int 
co_keyid int 
value text 

CO_KEY

co_keyid int 
keyname varchar(128) 

的問題是:如何有效地控制現場鍵名是在獨特應用層?

例如:

客戶端1個插入物( 「姓名」, 「客戶端1」)

與此同時,客戶機2個插入物( 「姓名」, 「客戶端1」)

Function Put(Name, Value) { 
    Id = SELECT co_keyid FROM co_key WHERE co_keyname = :Name 

    If(!Id) { 
     // Autoincrement 
     Id = INSERT INTO co_key (NULL, :Name) 
    } 

    INSERT INTO co_keyvalue (NULL, :id, :Value) 
} 

我知道我可以鎖定所有的表格,但還有其他方法嗎?

+0

哪個數據庫?如果你將它們定義爲UNIQUE,DB應該處理這個。 – SriniV

回答

1

您不應該在應用程序層解決這個問題。你可以在數據庫層解決它。作爲一般規則,您希望數據庫執行數據完整性規則,因爲您注意到的原因 - 多個線程可能會同時嘗試不兼容的操作。數據庫符合ACID標準(或者至少可以使用正確的參數設置),允許隔離不同的事務。

因此,您的問題的解決方案是一對唯一的約束/索引:co_key(keyname)co_keyvalue(co_keyid, value)。一旦你有了這些,你將需要檢查代碼中由錯誤數據產生的錯誤。

+0

正確...所以我必須檢查錯誤:INSERT INTO co_key(NULL,:Name),如果它引發「唯一違規」,我必須再次執行表中的任何「SELECT」操作? – user3558040

+0

@ user3558040。 。 。我可能會以另一種順序來做。查找id,如果它不存在,插入它,然後使用'last_insert_id()'。 –

+0

這不是我在做什麼? – user3558040