Должен ли я заблокировать таблицу ISAM для вставки значения в поле уникального ключа? - PullRequest
1 голос
/ 04 октября 2008

У меня есть таблица ISAm в mySql, которая была создана примерно так:

create table mytable (
 id int not null auto_increment primary key,
 name varchar(64) not null );

create unique index nameIndex on mytable (name);

У меня есть несколько процессов, вставляющих строки в эту таблицу. Если два процесса пытаются вставить одно и то же «имя», я хочу убедиться, что один из них либо получит ошибку, либо найдет строку с совпадающим «именем».

Должен ли я заблокировать таблицу и в блокировке убедиться, что имя не существует, или я должен полагаться на сервер, выдающий ошибку одному из процессов, которые пытаются вставить значение, которое уже существует в индексируемом уникальном поле

Я немного не решаюсь использовать блокировку, потому что не хочу попадать в тупиковую ситуацию.

Ответы [ 2 ]

4 голосов
/ 04 октября 2008

Не беспокойтесь о блокировке, ваш индекс предотвратит дублирование. Вам следует обработать код ошибки из вашего приложения.

MySQL должен возвращать код ошибки 1062 (или SQLSTATE 23000) при нарушении ограничения уникального ключа.

0 голосов
/ 04 октября 2008

Кстати, как вы описали страх столкновения с ЗАМЕРКОЙ, причинно-следственная связь может быть не совсем понятна (если в ваших запросах есть нечто большее, чем описано в вопросе).

Хорошее резюме, написанное кем-то другим :

  1. Запрос 1 начинается с блокировки ресурса A
  2. Запрос 2 начинается с блокировки ресурса B
  3. Запрос 1, чтобы продолжить, нуждается в блокировке ресурса B, но Query 2 блокирует этот ресурс, поэтому Query 1 начинает ожидать его освобождения
  4. Тем временем Query 2 пытается завершиться, но для завершения ему требуется блокировка ресурса A, но он не может получить это, потому что Query 1 имеет блокировку на этом.
...