Какой sql запрос выполнится быстрее?
START TRANSACTION;
select * from users where id = 54 FOR UPDATE
//проверка бизнес логики на наличие денег
update `users` set `balance` = `balance` - 150 where `id` = 54;
COMMIT;
Запрос "where `id` = 54 and `balance` >= 150" - опасен.
Innodb лочит не конкретные записи, а диапазоны индексов - при таком запросе в блокировку будут попадать все записи с балансом >= 150, со всеми вытекающими.
Что один запрос, что другой - атомарные (при AUTOCOMMIT = 1) и их выполнение не пересекается с другими запросами. Никакой дополнительной блокировки для них не требуется, скорость запросов, при уникальном `id` будет практически одинаковая.
Блокировка требуется, если вы сначала получаете баланс (SELECT), затем проверяете возможность списания средств, и только потом списываете их (UPDATE). В таком случае надо блокировать таблицу или строку, чтобы за время проверки не было списания средств другим потоком.