Rsa97, для запроса с balance >= 150 не нужна блокировка. Если другой поток снял баланс, то этот запрос не выполнится и отдаст нам false. Мы просто прекратим дальнейшее выполнение и отдадим ошибку.
Вот: С блокировкой же мы сначала блокируем запись, уменьшаем баланс без `balance` >= 150, таким запросом:
update `users` set `balance` = `balance` - 150 where `id` = 54
Ну не делайте блокировки и у вас пользователи будут делать баланс из ничего. Перед вторым запросом есть запрос на блокировку select balance from user where id = 1 for update и изменить нельзя его, пока мы транзакцию не закроем.