Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по курсу ИСиТ.docx
Скачиваний:
6
Добавлен:
07.02.2024
Размер:
1.07 Mб
Скачать

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

Транзакция является единственной единицей работы. Если транзакция выполнена успешно, все модификации данных, сделанные в течение транзакции, принимаются и становятся постоянной частью базы данных. Если в результате выполнения транзакции происходят ошибки и должна быть произведена отмена или выполнен откат, все модификации данных будут отменены.

SQL Server работает в следующих режимах транзакций.

  • Автоматическое принятие транзакций

Каждая отдельная инструкция является транзакцией.

  • Явные транзакции

Каждая транзакция явно начинается с инструкции BEGIN TRANSACTION и явно заканчивается инструкцией COMMIT или ROLLBACK.

  • Неявные транзакции

Новая транзакция неявно начинается, когда предыдущая транзакция завершена, но каждая транзакция явно завершается инструкцией COMMIT или ROLLBACK.

  • Распределенные транзакции

Распределенные транзакции выполняются над ресурсами на двух или более серверах.

Автоматическая фиксация транзакций

Режим автоматической фиксации транзакций используется компонентом Database Engine по умолчанию. После завершения каждая инструкция Transact-SQL фиксируется или откатывается назад. Если инструкция выполняется без ошибок, она фиксируется. В противном случае она откатывается назад. Соединение с экземпляром компонента Database Engine работает в режиме автоматической фиксации везде, где не используются явные или неявные транзакции.

Соединение с экземпляром компонента Database Engine работает в режиме автоматической фиксации до тех пор, пока явная транзакция не запускается инструкцией BEGIN TRANSACTION или не включается режим неявной транзакции. Если явная транзакция фиксируется или откатывается назад или выключается режим неявной транзакции, то соединение переходит в режим автоматической фиксации транзакций.

Присвоение параметру IMPLICIT_TRANSACTIONS значения ON устанавливает для соединения режим неявных транзакций. Значение OFF возвращает соединение в режим с автоматической фиксацией транзакций.

Ошибки времени компиляции и выполнения

Иногда в режиме автоматической фиксации экземпляр компонента Database Engine откатывает назад весь пакет вместо одной инструкции SQL. Это происходит, если ошибка возникает во время компиляции, а не во время выполнения. Ошибка компиляции не позволяет компоненту Database Engine построить план выполнения, поэтому пакет не выполняется. Поскольку произошел откат назад всех инструкций, предшествующих неправильной инструкции, нельзя выполнить весь пакет.

В следующем примере ни одна из инструкций INSERT в третьем пакете не выполнится из-за ошибки компиляции. При этом произойдет откат первых двух инструкций INSERT и они не будут выполняться ни при каких условиях.

CREATE TABLE TestBatch (Cola INT PRIMARY KEY, Colb CHAR(3));

GO

INSERT INTO TestBatch VALUES (1, 'aaa');

INSERT INTO TestBatch VALUES (2, 'bbb');

INSERT INTO TestBatch VALUSE (3, 'ccc'); -- Синтаксическая ошибка.

GO

SELECT * FROM TestBatch; -- Не возвращает ни одной строки.

GO

В следующем примере третья инструкция INSERT вызывает ошибку повторения первичного ключа во время выполнения. Первые две инструкции INSERT выполняются успешно и фиксируются, поэтому остаются после возникновения ошибки времени выполнения.

CREATE TABLE TestBatch (Cola INT PRIMARY KEY, Colb CHAR(3));

GO

INSERT INTO TestBatch VALUES (1, 'aaa');

INSERT INTO TestBatch VALUES (2, 'bbb');

INSERT INTO TestBatch VALUES (1, 'ccc'); -- Дублирование первичного ключа.

GO

SELECT * FROM TestBatch; -- Возвращает строки 1 и 2.

GO

Компонент Database Engine использует отложенное разрешение имен, при котором имена объектов разрешаются только во время выполнения. В следующем примере первые две инструкции INSERT выполняются и фиксируются, а вставленные строки остаются в таблице TestBatch после того, как третья инструкция INSERT вызывает ошибку времени выполнения, ссылаясь на таблицу, которой не существует.

CREATE TABLE TestBatch (Cola INT PRIMARY KEY, Colb CHAR(3));

GO

INSERT INTO TestBatch VALUES (1, 'aaa');

INSERT INTO TestBatch VALUES (2, 'bbb');

INSERT INTO TestBch VALUES (3, 'ccc'); -- Неверное имя таблицы.

GO

SELECT * FROM TestBatch; -- Возвращает строки 1 и 2.

GO

Соседние файлы в предмете Информатика