Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LektsiiNovye.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.92 Mб
Скачать

Устойчивость

Последним из ACID-свойств является устойчивость. Устойчивость означает, что после того, как транзакция фиксирована, влияние этой транзакции в базе данных становится постоянным – даже в случае отказа системы. Устойчивость обеспечивается журналом транзакций SQL Server и резервными копиями базы данных. При отказе SQL Server, операционной системы или какого-либо компонента сервера база данных будет автоматически восстановлена при перезапуске SQL Server. SQL Server использует журнал транзакций для воспроизведения фиксированных транзакций, на которые повлиял отказ системы, а также выполняет откат любых нефиксированных транзакций.

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

Режимы транзакций

Транзакция может начинаться в одном из трёх режимов: автофиксация (autocommit), явный режим (explicit) или неявный режим (implicit). По умолчанию для SQL Server принят режим автофиксации.

Режим автофиксации

В режиме автофиксации каждый оператор T-SQL фиксируется по его завершении, и в этом режиме не требуется никаких дополнительных операторов для управления транзакциями. Иными словами, каждая транзакция состоит только из одного оператора T-SQL. Режим автофиксации полезен при выполнении операторов с помощью интерактивной командной строки, утилиты OSQL или анализатора очередей SQL Server Query Аnalyzer, поскольку в этом режиме не нужно задавать в явном виде запуск и окончание каждой транзакции. Каждый оператор будет рассматриваться системой SQL Server как отдельная транзакция и будет фиксироваться сразу после его завершения. Режим автофиксации будет использоваться в каждом соединении с SQL Server, пока не будет запущена транзакция в явном режиме с помощью оператора BEGIN TRANSACTION или пока не будет указан неявный режим. По окончании явно заданной транзакции или после отключения неявного режима SQL Server возвращается к режиму автофиксации.

Явный режим

Явный режим используется чаще всего для программных приложений, а также для хранимых процедур, триггеров и сценариев. При запуске группы операторов для выполнения какой-либо задачи может потребоваться указание начала и конца данной транзакции, чтобы затем выполнить фиксацию всей группы операторов или отмену (откат) модификаций всей группы. Явная транзакция задаётся с помощью операторов T-SQL или с помощью функций API.

Рассмотрим ситуацию, в которой явно требуется использование явной транзакции для запуска и окончания задачи. Предположим, что есть хранимая процедура с именем Поместить_Заказ, которая управляет в базе данных задачей размещения заказа покупателя на какой-либо товар. Эта процедура включает в себя следующие шаги: выбор информации о текущем счёте покупателя, ввод идентификационного номера нового заказа и наименования товара, расчёт стоимости заказа с учётом налогов, обновление остатка на счёте покупателя с учётом общей стоимости и проверка наличия товара на складе.

Для согласованности информации в базе данных нужно, чтобы были завершены все эти шаги или не был завершён ни один из этих шагов. Для этой цели следует сгруппировать все операторы, управляющие данной задачей, в одну явную транзакцию. Если эти операторы не будут объединены в одну группу, это может привести к несогласованному состоянию данных. Например, при обрыве соединения клиента с сервером после завершения шага, где вводится номер нового заказа, но до обновления остатка на счете покупателя, в базе данных появится новый заказ для данного покупателя, но без снятия денег со счета покупателя. В этом случае SQL Server фиксирует каждый оператор сразу после его окончания, что оставляет хранимую процедуру незаконченной на момент разъединения сети. Но если все указанные шаги определены в рамках одной явной транзакции, то в случае разъединения SQL Server автоматически выполнит откат всей транзакции, а клиент может затем снова подсоединиться к серверу и повторно выполнить данную процедуру.

Использование явных транзакций, когда задача состоит из нескольких шагов, как в предыдущем примере, также даёт преимущества, поскольку SQL Server (независимо от использования операторов ROLLBACK) автоматически выполнит откат транзакций в случае серьезных ошибок, таких как обрыв связи в сети, аварийный сбой (базы данных или клиентской системы) или взаимоблокировка. Для запуска транзакции используется оператор T-SQL BEGIN TRANSACTION. Чтобы указать конец транзакции, используется команда COMMIT TRANSACTION или ROLLBACK TRANSACTION. В операторе BEGIN TRANSACTION можно дополнительно указать имя транзакции и затем ссылаться на эту транзакцию по имени в операторе COMMIT TRANSACTION или ROLLBACK TRANSACTION. Ниже показан синтаксис этих трех операторов:

BEGIN TRAN[SACTION] [<name_transacton> | <@var_ transacton>]

COMMIT [TRAN[SACTION] [<name_transacton> | <@var_ transacton>]

ROLLBACK [TRAN[SACTION] [<name_transacton> | <@var_ transacton>]

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]