Транзакции в MySQL
Зачастую нам нужно чтобы несколько запросов точно применились и выполнились "одновременно", либо не выполнился ни один из них, если что-то пойдёт не так. В качестве примера можно привести систему оплаты на сайте. В момент покупки заказ должен быть помечен как оплаченный, и вместе с этим, одновременно нужно списать деньги с баланса пользователя. Если что-то одно не выполнится - будет либо пользователь без купленного товара и без денег, либо магазин без товара и без денег. Избежать таких ситуаций позволяют транзакции - это механизм, который позволяет выполнить несколько запросов одной операцией.
Выглядит весь процесс следующим образом:
- Начинается транзакция
- Перечисляются запросы, которые должны быть выполнены одной операцией
- Транзакция завершается
При этом транзакцию можно завершить двумя способами:
- либо подтвердить её и тогда все запросы, перечисленные после начала транзакции, будут выполнены;
- либо откатить все изменения и тогда ни один запрос не выполнится.
Начинается транзакция ключевым словом BEGIN.
Завершается либо словом COMMIT (применить изменения), либо ROLLBACK (откатить изменения).
Приведём пример транзакции:
BEGIN;
UPDATE `orders` SET `state`="paid" WHERE order_id=313;
UPDATE `users` SET `balance`=`balance`-100 WHERE id=37;
COMMIT;
После завершения транзакции будет гарантировано, что оба запроса либо выполнились успешно, либо, если хотя бы один из них выполнить не удалось, не будет выполнен ни один из них.
Комментарии