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

У меня есть таблица 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 ответа

Решение

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

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

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

Хорошее резюме кто-то еще написал:

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