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


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

См. также

Справочник

ALTER TABLE (Transact-SQL)

BEGIN TRANSACTION (Transact-SQL)

CREATE TABLE (SQL Server)

DELETE (Transact-SQL)

DROP TABLE (Transact-SQL)

FETCH (Transact-SQL)

Инструкция GRANT (Transact-SQL)

Инструкция INSERT (Transact-SQL)

OPEN (Transact-SQL)

REVOKE (Transact-SQL)

SELECT (Transact-SQL)

Инструкции SET (Transact-SQL)

SET ANSI_DEFAULTS (Transact-SQL)

@@TRANCOUNT (Transact-SQL)

TRUNCATE TABLE (Transact-SQL)

UPDATE (Transact-SQL)