Программирование >>  Реализация баз данных 

1 ... 118 119 120 [ 121 ] 122 123 124 ... 162


Типы транзакций

SQL Server поддерживает три типа транзакций: явные, с автоматической фиксацией и

неявные.

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

Явная транзакция - это транзакция, начало еи которой определен отно. В предыдущих версиях SQL Server такие транзакции назывались пользовательскими или определяемыми пользователем .

Для определения транзакций в приложениях и сценариях Transact-

SQL используются операторы BEGIN TRANSACTION, COMMIT TRANSACTION, COMMIT WORK, ROLLBACK TRANSACTION или ROLLBACK WORK:

TRANSACTION - задает точку явной транзакции для соединения;

COMMIT TRANSACTION или COMMIT WORK - используется для успешного шения транзакции, если не возникла ошибка. Все выполненные транзакцией модификации данных сохраняются в БД. Задействованные в транзакции ресурсы освобождаются;

ROLLBACK TRANSACTION или ROLLBACK WORK - используется для отмены транзакции, во время которой возникла ошибка. Все данные, модифицированные во время транзакции, возвращаются в исходное состояние. Задействованные в транзакции ресурсы освобождаются.

В показанной ниже транзакции оператор ROLLBACK TRANSACTION откатывает все изменения, сделанные оператором UPDATE:

BEGIN TRANSACTION ,

USE Northwind

UPDATE Customers

SET ContactName = Hanna Moos

WHERE ustoitierlD = BLAUS

ROLLBACK TRANSACTION

Если в этом примере вместо оператора ROLLBACK TRANSACTION использовать оператор COMMIT TRANSACTION, все обновления записываются в БД.

Явные транзакции также можно определять средствами API OLE DB, ADO и ODBC.

Подробней об этом - в SQL Server Books Online.

Режим явных транзакций действует только на протяжении данной транзакции. После завершения транзакции соединение возвращается в режим, заданный до запуска этого

режима, то есть в неявный или с автофиксацией. Транзакции с автоматической фиксацией

Режим автоматической фиксации транзакций является режимом управления транзакциями SQL Server по умолчанию. В этом режиме каждый завершенный оператор Tran.MCt-

SQL либо фиксируется, либо откатывается. Если оператор выполнен успешно, он фиксируется, если при его исполнении возникла ошибка, выполняется откат. SQL

Server всегда работает в режиме автофиксации транзакций, если этот режим не заменен



358 Управление трамзакцишн и {Рокировками в SQL Senmr Глаша 12

режимом явных или неявные шакций. Режим автофиксации считается режимом по умолчанию для ADO, OLE DB, ODUC, и DB-Library.

Соединение Server продолжлет работать в режиме автофиксации, пока не начнется явная транзакция (при исполнегии оператора BEGIN TRANSACTION) или не будет активирован режим неявнышашнй (включением соответствующего cipLu. После фиксации/отката явной транзакции или выключения режима неявные юакций SQL

Server возвращается в режим автоматической фиксации.

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

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

ляции, но не ошибки периода нения, Ошибка компиляции не дает SQL Server построить, план исполнения, поэтому ни один оператор пакета не будет исполнен. При этом осуществляется откат всех операторов, выполненных перед сбойным оператором. Таким ошибка препятствует всех команд пакета.

В показанном ниже примере не выполняется ни один оператор INSERT из третьего пакета, поскольку при компиляции третьего оператора INSERT из этого пакета возникает ошибка. Она провоцирует откат операторов, поэтому в Test Batch не

добавляются никакие данные:

USE Pubs , ..

CREATE TABLE TestBfl+ch (Cola INT PRIMARY KEY, Colb CHAR{3))

INSERT INTO TestBatch VALUES (1, aaa} INSERT INTO TestBatch VALUES (2, nbh)

INSERT INTO TestBatch VALUSE (3, ccc} /* Здесь синтаксическая ошибка*/ GO

SELECT * EROM TestBatch /* Это оператор результатов не вернет */ GO

В следующем примере третий атор INSERT генерирует ошибку периода выполнения (дублирующийся первичный ключ). Но первые два оператора INSERT исполняются

успешно и фиксируются, поэтому значения добавляются в таблицу TestBatch:

USE Pubs

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

INSERT INTO TestBatch VALUES (1 мя)

INSERT INTO TestBatch VALUES (2, bbb) ....

INSERT INTO TestBatch VALUES (1, qcu ) /* Ошибка: дублирующийся ключ */ GO

SELECT * FROM TestBatch /* Этот оператор вернет строки 1 и 2 */ GO

В SQL Server используется отложенное разрешение имен, когда разрешение имен объектов откладывается до периода выполнения. В следующем примере первые два оператора INSERT выполняются и фиксируются, а две строки, добавленные этими операторами, остаются в TestBatch даже после того, как третий оператор INSERT генерирует ошибку периода выполнения (ссылаясь на несуществующую таблицу):



USE Pubs GO

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

INSERT INTO TestBatch VALUES (1, aaa) INSERT INTO TestBatch VALUES (2, bbb)

INSERT INTO TestBch VALUES (3, ccc) /* Ошибка: неверное имя таблицы */

SELECT * EROM TestBatch /* Этот онератор вернет строки 1 и 2 ./

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

Если соединение работает в режиме неявные чкiinii. то посл -алпл или отката SQL Server автоматически начинает новую транзакцию. В этом режиме не нужно заботиться об определении границ транзакций - только о фиксации или

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

После включения для соединения режима неявной транзакции SQL Server автоматически начинает транзакцию при первом исполнении любого из операторов, перечисленных ниже:

ALTER TABLE INSERT

CREATE OPEN

DELETE REVOKE

DROP SELECT

FETCH TRUNCATE TABLE

GRANT UPDATE

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

ключен.

Режим неявных транзакций также можно включить средствами оператора

SET или функций и методов API БД.

Неявные транзакции Transact-SQL

Для запуска режима неявных транзакций в приложениях и сценариях

SQL используют оператор Transact-SQL SET IMPLICIT TRANSACTIONS ON. В конце каждого пакета необходимо отключать этот режим средствами оператора SET TRANSACTIONS OFF. Для завершения транзакций предназначены операторы COMMIT TRANSACTION, COMMIT WORK, ROLLBACK TRANSACTION и ROLLBACK WORK.

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

USE Pubs

CREATE TABLE ImplicitTran

Cola INT PRIMARY KEY,



1 ... 118 119 120 [ 121 ] 122 123 124 ... 162

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика