Чат Telegram
Группа ВКонтакте
Транзакции в СУБД MySQL

Транзакции в MySQL

Зачастую нам нужно чтобы несколько запросов точно применились и выполнились "одновременно", либо не выполнился ни один из них, если что-то пойдёт не так. В качестве примера можно привести систему оплаты на сайте. В момент покупки заказ должен быть помечен как оплаченный, и вместе с этим, одновременно нужно списать деньги с баланса пользователя. Если что-то одно не выполнится - будет либо пользователь без купленного товара и без денег, либо магазин без товара и без денег. Избежать таких ситуаций позволяют транзакции - это механизм, который позволяет выполнить несколько запросов одной операцией.

Выглядит весь процесс следующим образом:

  1. Начинается транзакция
  2. Перечисляются запросы, которые должны быть выполнены одной операцией
  3. Транзакция завершается

При этом транзакцию можно завершить двумя способами:

  • либо подтвердить её и тогда все запросы, перечисленные после начала транзакции, будут выполнены;
  • либо откатить все изменения и тогда ни один запрос не выполнится.

Начинается транзакция ключевым словом BEGIN.
Завершается либо словом COMMIT (применить изменения), либо ROLLBACK (откатить изменения).

Приведём пример транзакции:

BEGIN;
UPDATE `orders` SET `state`="paid" WHERE order_id=313;
UPDATE `users` SET `balance`=`balance`-100 WHERE id=37;
COMMIT;

После завершения транзакции будет гарантировано, что оба запроса либо выполнились успешно, либо, если хотя бы один из них выполнить не удалось, не будет выполнен ни один из них.

loader
Логические задачи с собеседований