2008-10-04 6 views
1

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

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

create unique index nameIndex on mytable (name); 

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

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

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

Пожалуйста, дайте мне знать, что вы думаете. Благодаря!

ответ

4

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

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

+0

Я также хотел бы добавить, что он должен обязательно использовать try/catch для улавливания ошибки, чтобы приложение не просто умирало из-за ошибки SQL. – Vic 2010-11-18 21:09:47

0

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

Хороший summary someone else wrote:

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