2013-02-28 63 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