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

+0

приветствуется ': D' –

+0

Быстрое наблюдение, у меня ранее был уникальный код на 'key', который я предположим, больше не используется? – IainW

1

Как насчет использования LOCK TABLES синтаксиса для предотвращения условий гонки при вставке?

+0

Моя забота о блокировке полной таблицы состоит в том, что таблица, о которой идет речь, будет сильно прочитана, и я не уверен, насколько это повлияет на производительность? – IainW

Смежные вопросы