Транзакция может состоять из нескольких операторов базы данных, и код приложения может чередоваться.
Представьте себе простой денежный перевод:
START TRANSACTION;
SELECT amount FROM account WHERE account_nr = 432 FOR UPDATE;
/* do some calculation in the application */
UPDATE account SET amount = 543.23 WHERE account_nr = 432;
SELECT amount FROM account WHERE account_nr = 123 FOR UPDATE;
/* do another calculation in the application */
UPDATE account SET amount = 1903.4 WHERE account_nr = 123;
COMMIT;
Теперь в любой момент вы можете столкнуться с проблемой , например:
- Второй оператор
SELECT
может не вернуть результат, потому что такой учетной записи нет. - Второй
UPDATE
может завершиться ошибкой, потому что он нарушает базу данных ограничение. - Второе вычисление в приложении может вызвать состояние ошибки.
Если что-то подобное произойдет, вам необходимо прервать транзакцию и отменить ее работу. Например, вы не можете позволить изменениям в учетной записи 432 стать видимыми.
Правильный способ сделать это в реляционной базе данных - выдать ROLLBACK
, тогда все это произойдет автоматически.
Транзакции - это услуга, позволяющая пользователю легко писать надежный и устойчивый код.