2013-02-28 69 views
0

當我將一行插入一個不包含唯一索引的表中時,我將如何去防止競爭條件。例如說我的表是....如何用INSERT防止競態條件?

key | slot | label 
------------------ 
1 | 1 | some 
1 | 2 | some 
2 | 1 | some 
2 | 2 | some 

...是爲了防止這樣的競爭條件來創建一個獨特的複合材料領域,如的唯一途徑「鍵:槽」例如

id | key | slot | label 
------------------------ 
1:1 | 1 | 1 | some 
1:2 | 1 | 2 | some 
2:1 | 2 | 1 | some 
2:2 | 2 | 2 | some 

...還是有更高效的方法逃脫了我?如果我在執行插入操作後檢查重複行,並在發現任何事務時將事務重新展開,那麼該怎麼辦?

回答

2

實際上,您可以在沒有key:slot列的情況下執行此操作。您可以在表格上定義一個唯一的複合鍵。例如,

ALTER TABLE tableName ADD CONTRAINT tb_uq UNIQUE (`key`, slot) 
+0

非常好,我不知道這是可能的,但看起來像理想的解決方案,謝謝:) – IainW 2013-02-28 04:16:47

+0

不客氣':D' – 2013-02-28 04:26:18

+0

快速跟進,我以前有一個非唯一索引'關鍵'我假定不再有用? – IainW 2013-02-28 04:36:35

1

如何使用LOCK TABLES語法來防止插入時的競爭條件?

+0

我對鎖定整個表格的擔心是,有問題的表格將被大量讀取,而且我不確定這會對性能產生多大影響? – IainW 2013-02-28 04:18:09