Вы очень просто предотвращаете дублирование строк, помещая уникальные индексы в свои таблицы. Это не имеет никакого отношения к ЗАМКАМ или СДЕЛКАМ.
Вас волнует, если вставка не удалась, потому что это дубликат? Вы должны быть уведомлены, если это терпит неудачу? Или все, что имеет значение, что строка была вставлена, и не имеет значения, кем или сколько неудачных вставок дубликатов?
Если вам все равно, то все, что вам нужно, это INSERT IGNORE
. Нет необходимости думать о транзакциях или блокировках таблиц.
InnoDB автоматически блокируется на уровне строк, но это относится только к обновлениям и удалениям. Вы правы, что это не относится к вставкам. Вы не можете заблокировать то, что еще не существует!
Вы можете явно LOCK
вся таблица. Но если ваша цель - предотвратить дублирование, то вы делаете это неправильно. Опять же, используйте уникальный индекс.
Если необходимо внести ряд изменений и вы хотите получить результат «все или ничего» (или даже набор результатов «все или ничего» в рамках более крупного результата «все или ничего»), используйте транзакции и . точки сохранения Затем используйте ROLLBACK
или ROLLBACK TO SAVEPOINT *savepoint_name*
для отмены изменений, включая удаление, обновления и вставки.
LOCK
таблицы не являются заменой для транзакций, но это единственный вариант для таблиц MyISAM, которые не поддерживают транзакции. Вы также можете использовать его с таблицами InnoDB, если блокировки на уровне строк недостаточно. См. на этой странице для получения дополнительной информации об использовании транзакций с операторами таблицы блокировок.