Поделиться через


SET IMPLICIT_TRANSACTIONS (Transact-SQL)

Устанавливает для соединения режим неявных транзакций.

Значок ссылки на разделСинтаксические обозначения в Transact-SQL

Синтаксис

SET IMPLICIT_TRANSACTIONS { ON | OFF }

Замечания

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

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

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 и SQL Server при соединении автоматически устанавливают для параметра IMPLICIT_TRANSACTIONS значение OFF. SET IMPLICIT_TRANSACTIONS по умолчанию устанавливается в значение OFF для соединений с управляемым поставщиком SQLClient и SOAP-запросов, получаемых через конечные точки протокола HTTP.

При присвоении параметру SET ANSI_DEFAULTS значения ON параметр SET IMPLICIT_TRANSACTIONS получает значение ON.

Значение SET IMPLICIT_TRANSACTIONS устанавливается во время выполнения или запуска, а не во время синтаксического анализа.

Примеры

Следующий пример демонстрирует явный и неявный запуск транзакций при присвоении параметру IMPLICIT_TRANSACTIONS значения ON. Для демонстрации открытых и закрытых транзакций в нем используется функция @@TRANCOUNT.

USE AdventureWorks2008R2;
GO
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