Имеется запрос такого вида:
SELECT `id` FROM `table`
WHERE `index1` = :index1
AND `index2` = :index2
AND `index3` = :index3
AND `index4` = :index4
FOR UPDATE
.. где id - это первичный ключ, а indexN - это колонки с индексами.
Далее, на основании существования id должна производиться либо вставка новой строки INSERT, либо её обновление UPDATE.
Первый вопрос: будут ли операцией FOR UPDATE заблокированы на изменение другие строки, в которых часть индексов indexN будет совпадать по значению, указанному в WHERE?
И второй вопрос: является ли операция INSERT ON DUPLICATE KEY UPDATE эффективнее обозначенной выше, если предполагается, что INSERT - единовременная, тогда как последующих UPDATE - будет подавляющее большинство?
Вопрос 1: Нет. Блокируются только отобранные записи.
Вопрос 2: Да, несомненно.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей