Если вы действительно хотите беспокоиться о блокировке, сделайте это.
Таблица ОБНОВЛЕНИЙ SET состояние = «НЕАКТИВНО» ГДЕ id = «ключ»;
Если это удастся, был дубликат.
- ВСТАВЬТЕ дополнительную неактивную запись. Делайте со своими дубликатами все, что захотите.
Если это не помогло, дубликатов не было.
- ВСТАВИТЬ новую активную запись.
Commit.
Это сразу же захватывает эксклюзивный замок. Альтернативы не так хороши.
Начните с ВСТАВКИ, и проверка на наличие дубликатов не захватит блокировку, пока вы не начнете обновление. Непонятно, если это проблема или нет.
Для начала с SELECT потребуется добавить LOCK TABLE, чтобы убедиться, что выбор удерживает найденную строку, чтобы ее можно было обновить. Если строка не найдена, вставка будет работать нормально.
Если у вас есть несколько одновременно работающих писателей, и два писателя могут пытаться получить доступ одновременно, вы не сможете допустить блокировку на уровне строк.
Учтите это.
Процесс A выполняет LOCK ROW и SELECT, но не находит строки.
Процесс B выполняет LOCK ROW и SELECT, но не находит строки.
Процесс A делает INSERT и COMMIT.
Процесс B делает INSERT и COMMIT. Теперь у вас есть дубликаты активных записей.
Несколько одновременных транзакций вставки / обновления будут работать только с блокировкой на уровне таблицы. Да, это потенциальное замедление. Три правила: (1) Сделайте свои транзакции как можно короче, (2) снимите блокировки как можно быстрее, (3) обработайте взаимные блокировки, повторив попытку.