SET IMPLICIT_TRANSACTIONS (Transact-SQL)
Устанавливает для соединения режим неявных транзакций.
Применимо для следующих объектов: SQL Server (SQL Server 2008 по текущую версию), База данных SQL Windows Azure (с первоначального выпуска по текущий выпуск). |
Синтаксические обозначения в Transact-SQL
Синтаксис
SET IMPLICIT_TRANSACTIONS { ON | OFF }
Замечания
Присвоение параметру SET IMPLICIT_TRANSACTIONS значения ON устанавливает для соединения режим неявных транзакций. Значение OFF возвращает соединение в режим с автоматической фиксацией транзакций. Неявные транзакции могут быть неожиданно включены из-за значений по умолчанию ANSI. Если IMPLICIT_TRANSACTIONS = ON, то явная инструкция BEGIN TRANSACTION начнет две вложенные транзакции.
Когда соединение находится в режиме неявных транзакций, и соединение в этот момент не участвует в транзакции, выполнение любой из следующих инструкций начнет транзакцию.
ALTER TABLE |
FETCH |
REVOKE |
BEGIN TRANSACTION |
GRANT |
SELECT (См. исключение ниже.) |
CREATE |
INSERT |
TRUNCATE TABLE |
DELETE |
OPEN |
UPDATE |
DROP |
Если соединение уже начало транзакцию, эти инструкции не начинают новую транзакцию.
Для транзакций, автоматически открываемых в результате присвоения этому параметру значения ON, пользователю необходимо явно выполнить в конце транзакции фиксацию или откат. Иначе после отключения пользователя будет выполнен откат транзакции и будут потеряны все сделанные ей изменения данных. После фиксации транзакции выполнение одной из указанных выше инструкций начнет новую транзакцию.
Режим неявных транзакций остается в силе, пока в соединении не будет выполнена инструкция SET IMPLICIT_TRANSACTIONS OFF, которая вернет соединение в режим автоматической фиксации. В режиме автоматической фиксации все отдельные инструкции фиксируются в случае успешного завершения.
Поставщик собственного клиента SQL Server для SQL Server и драйвер ODBC собственного клиента SQL Server при соединении автоматически устанавливают для параметра IMPLICIT_TRANSACTIONS значение OFF. SET IMPLICIT_TRANSACTIONS по умолчанию устанавливается в значение OFF для соединений с управляемым поставщиком SQLClient и SOAP-запросов, получаемых через конечные точки протокола HTTP.
При присвоении параметру SET ANSI_DEFAULTS значения ON параметр SET IMPLICIT_TRANSACTIONS получает значение ON.
Выполнение инструкции BEGIN TRANSACTION, когда SET IMPLICIT_TRANSACTIONS задано как ON, приводит к открытию двух вложенных транзакций. BEGIN TRANSACTION увеличивает значение @@trancount, когда транзакция является активной.
Значение SET IMPLICIT_TRANSACTIONS устанавливается во время выполнения или запуска, а не во время синтаксического анализа.
Инструкции SELECT, которые не производят выборку из таблицы, не запускают неявные транзакции. Например, SELECT GETDATE(); или SELECT 1, 'ABC'; не требуют транзакций.
Чтобы просмотреть текущее значение параметра для IMPLICIT_TRANSACTIONS, выполните следующий запрос.
DECLARE @IMPLICIT_TRANSACTIONS VARCHAR(3) = 'OFF';
IF ( (2 & @@OPTIONS) = 2 ) SET @IMPLICIT_TRANSACTIONS = 'ON';
SELECT @IMPLICIT_TRANSACTIONS AS IMPLICIT_TRANSACTIONS;
Примеры
Следующий пример демонстрирует явный и неявный запуск транзакций при присвоении параметру IMPLICIT_TRANSACTIONS значения ON. Для демонстрации открытых и закрытых транзакций в нем используется функция @@TRANCOUNT.
SET NOCOUNT ON;
GO
SET IMPLICIT_TRANSACTIONS OFF;
GO
PRINT N'Tran count at start = '
+ CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
IF OBJECT_ID(N'dbo.t1',N'U') IS NOT NULL
DROP TABLE dbo.t1;
GO
CREATE table dbo.t1 (a int);
GO
INSERT INTO dbo.t1 VALUES (1);
GO
PRINT N'Use explicit transaction.';
BEGIN TRANSACTION;
GO
INSERT INTO dbo.t1 VALUES (2);
GO
PRINT N'Tran count in explicit transaction = '
+ CAST(@@TRANCOUNT AS NVARCHAR(10));
COMMIT TRANSACTION;
GO
PRINT N'Tran count after explicit transaction = '
+ CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
PRINT N'Setting IMPLICIT_TRANSACTIONS ON.';
GO
SET IMPLICIT_TRANSACTIONS ON;
GO
PRINT N'Use implicit transactions.';
GO
-- No BEGIN TRAN needed here.
INSERT INTO dbo.t1 VALUES (4);
GO
PRINT N'Tran count in implicit transaction = '
+ CAST(@@TRANCOUNT AS NVARCHAR(10));
COMMIT TRANSACTION;
PRINT N'Tran count after implicit transaction = '
+ CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
PRINT N'Nest an explicit transaction with IMPLICIT_TRANSACTIONS ON.';
GO
PRINT N'Tran count before nested explicit transaction = '
+ CAST(@@TRANCOUNT AS NVARCHAR(10));
BEGIN TRANSACTION;
PRINT N'Tran count after nested BEGIN TRAN in implicit transaction = '
+ CAST(@@TRANCOUNT AS NVARCHAR(10));
INSERT INTO dbo.t1 VALUES (5);
COMMIT TRANSACTION;
PRINT N'Tran count after nested explicit transaction = '
+ CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
-- Commit outstanding transaction.
COMMIT TRANSACTION;
GO
Ниже приводится результирующий набор.
Tran count at start = 2
Use explicit transaction.
Tran count in explicit transaction = 3
Tran count after explicit transaction = 2
Setting IMPLICIT_TRANSACTIONS ON.
Use implicit transactions.
Tran count in implicit transaction = 2
Tran count after implicit transaction = 1
Nest an explicit transaction with IMPLICIT_TRANSACTIONS ON.
Tran count before nested explicit transaction = 1
Tran count after nested BEGIN TRAN in implicit transaction = 2
Tran count after nested explicit transaction = 1
См. также
Справочник
BEGIN TRANSACTION (Transact-SQL)
Инструкция GRANT (Transact-SQL)
Инструкция INSERT (Transact-SQL)