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

StackOverflow https://stackoverflow.com/questions/169459

  •  05-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

Кстати, как вы описали страх столкновения с DEADLOCK, причинно-следственная связь может быть не совсем понятна (если в ваших запросах есть нечто большее, чем описано в вопросе).

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

  <Ол>   
  • Запрос 1 начинается с блокировки ресурса A
  •   
  • Запрос 2 начинается с блокировки ресурса B
  •   
  • Запрос 1, чтобы продолжить, нуждается в блокировке ресурса B, но Query 2 блокирует этот ресурс, поэтому Query 1 начинает ожидать его освобождения
  •   
  • Тем временем Query 2 пытается завершиться, но для завершения ему требуется блокировка ресурса A, но он не может этого получить, потому что Query 1 имеет блокировку на этом.
  •   
    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top