Имеется таблица: accounts: id, name, ..., balance balance никогда не должен становится меньше 0 Подскажите решение по переводу суммы с balance одного account'а на balance другого. Очень много читал туториалов по транзакциям но так и не понял как сделать.
Понятно что:
START TRANSACTION;
UPDATE accounts SET balance = balance - $amount WHERE id = $from;
UPDATE accounts SET balance = balance + $amount WHERE id = $to;
COMMIT;
Но как гарантировать что balance всегда >= 0? Что если другая транзакция в это время обновит balance? Проблема распростанённая, так что скорее всего достаточно хорошо известная. Но что то не могу ничего найти сам что бы быть уверенным в безопасности получившейся системы. Lock tables не хорошо для производительности, может какие то тригеры которые ROLLBACK в случае если balance < 0?