Описание транзакций
Транзакция — это одна или несколько инструкций T-SQL, которые рассматриваются как единица. Если одна транзакция завершается ошибкой, все операции завершаются ошибкой. Если транзакция выполнена успешно, вы знаете, что все инструкции изменения данных в транзакции были успешными и зафиксированы в базе данных.
Транзакции обеспечивают, что все операции внутри транзакции либо успешно завершаются, либо полностью завершаются сбоем, частичное выполнение не допускается. Транзакции инкапсулируют операции, которые должны логически выполняться вместе, например несколько записей в связанные таблицы, которые являются частью одной операции.
Рассмотрим бизнес, который хранит покупки в таблице Sales.Order и платежи в таблице Sales.Payment . Когда кто-то что-то покупает, необходимо обновить обе таблицы. Если это реализуется без транзакций, и возникает ошибка при записи платежа в базу данных, вставка Sales.Order по-прежнему будет зафиксирована, оставляя таблицу оплаты без записи.
При реализации с транзакциями обе записи осуществляются или обе записи не осуществляются. Если в таблице возникла ошибка при записи платежа, то вставка данных о заказе также будет отменена. Это означает, что база данных всегда находится в согласованном состоянии.
Следует отметить, что это относится к серьезным ошибкам, таким как аппаратные или сетевые ошибки. Ошибки в инструкциях SQL могут привести только к откату транзакции в определенных обстоятельствах, и важно проверить последующие единицы в этом модуле, чтобы полностью понять последствия использования транзакций.
Существуют различные типы транзакций:
Явные транзакции
Ключевые слова BEGIN TRANSACTION и либо COMMIT, либо ROLLBACK обозначают начало и конец каждого пакета инструкций. Это позволяет указать, какие инструкции или выражения должны быть зафиксированы или отменены вместе.
Неявные транзакции
Транзакция запускается при завершении предыдущей транзакции. Каждая транзакция явно завершена с помощью инструкции COMMIT или ROLLBACK.
Характеристики ACID
Для систем онлайн обработки транзакций (OLTP) требуется соответствие транзакций характеристикам ACID.
- Атомарность — каждая транзакция рассматривается как единая единица, которая успешно завершается или полностью терпит неудачу. Например, транзакция, которая включает в себя списание денежных средств с одного счета и начисление той же суммы на другой счет, должна выполнить оба действия. Если какое либо действие не удается завершить, другое действие тоже должно завершиться ошибкой.
- Согласованность — транзакции могут принимать только данные в базе данных из одного допустимого состояния в другое. Если продолжить приведенный выше пример списания и начисления, завершенное состояние транзакции должно отражать перевод денежных средств с одного счета на другой.
- Изоляция — одновременные транзакции не могут мешать друг другу и должны привести к согласованному состоянию базы данных. Например, когда транзакция для передачи средств из одной учетной записи в другую выполняется в процессе, другая транзакция, которая проверяет баланс этих счетов, должна возвращать согласованные результаты- транзакция проверки баланса не может получить значение для одной учетной записи, которая отражает баланс перед передачей, и значение для другой учетной записи, которая отражает баланс после передачи.
- Устойчивость — когда транзакция зафиксирована, она останется зафиксированной. После завершения транзакции по переводу на счет измененные балансы счетов сохраняются, так что даже если система базы данных будет отключена, зафиксированная транзакция будет отражена при ее повторном включении.