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

05.06.2018 в 18:09
8524
+646

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

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

  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
05.06.2018 в 18:09
8524
+646
Логические задачи с собеседований