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


SET IMPLICIT_TRANSACTIONS (Transact-SQL)

Применимо к:SQL ServerБаза данных SQL AzureУправляемый экземпляр SQL AzureAzure Synapse AnalyticsСистема платформы аналитики (PDW)Хранилище в Microsoft FabricБаза данных SQL в Microsoft Fabric

Устанавливает BEGIN TRANSACTION режим на имплицитный для соединения.

Соглашения о синтаксисе Transact-SQL

Синтаксис

SET IMPLICIT_TRANSACTIONS { ON | OFF }

Замечания

Когда ON, система находится в режиме неявной транзакции. Это означает, что если @@TRANCOUNT = 0, любая из следующих Transact-SQL операторов начинает новую транзакцию. Это эквивалентно казни невидимого BEGIN TRANSACTION первым:

Когда OFF, каждое из предыдущих T-SQL операторов ограничено невидимым BEGIN TRANSACTION и невидимым COMMIT TRANSACTION оператором. Когда OFF, мы говорим, что режим транзакции — это автокоммит. Если ваш T-SQL код явно выдаёт , BEGIN TRANSACTIONмы говорим, что режим транзакции явный.

Необходимо понимать несколько важных моментов.

  • Когда режим транзакции неявный, не выдаётся невидимый BEGIN TRANSACTION режим, если @@TRANCOUNT > 0 он уже существует. Однако любые явные BEGIN TRANSACTION утверждения всё равно увеличиваются @@TRANCOUNT.

  • Когда ваши INSERT выписки и всё остальное в вашей рабочей единице будут завершены, вы должны выдавать COMMIT TRANSACTION выписки до тех пор @@TRANCOUNT , пока они не уменьшатся обратно до нуля. Или вы можете оформить его ROLLBACK TRANSACTION.

  • SELECT Операторы, не выбирающие из таблицы, не запускают неявные транзакции. Например SELECT GETDATE(); , или SELECT 1, 'ABC'; не требуются транзакции.

  • Неявные транзакции могут неожиданно быть ON вызваны дефолтами ANSI. Подробности см. в НАБОРЕ ANSI_DEFAULTS.

    Настройка IMPLICIT_TRANSACTIONS не ON популярна. В большинстве случаев, когда IMPLICIT_TRANSACTIONS есть ON, это потому, SET ANSI_DEFAULTS ON что было установлено.

  • SQL Server Native Client OLE DB Provider для SQL Server и драйвер SQL Server Native Client ODBC автоматически IMPLICIT_TRANSACTIONSOFF устанавливаются при подключении. Установите IMPLICIT_TRANSACTIONS по умолчанию OFF для соединений с управляемым провайдером SQLClient и для SOAP-запросов, поступающих через HTTP-конечные точки.

Чтобы просмотреть текущую настановку для IMPLICIT_TRANSACTIONS, выполните следующий запрос.

DECLARE @IMPLICIT_TRANSACTIONS AS VARCHAR (3) = 'OFF';
IF ((2 & @@OPTIONS) = 2)
SET @IMPLICIT_TRANSACTIONS = 'ON';
SELECT @IMPLICIT_TRANSACTIONS AS IMPLICIT_TRANSACTIONS;

Примеры

Следующий сценарий Transact-SQL запускает несколько разных тестовых случаев. Также предоставляются текстовые выходные данные, подробно описывающие поведение и результаты в каждом тестовом случае.

-- Preparations.
SET NOCOUNT ON;
SET IMPLICIT_TRANSACTIONS OFF;
GO
WHILE (@@TRANCOUNT > 0) COMMIT TRANSACTION;
GO
IF (OBJECT_ID(N'dbo.t1',N'U') IS NOT NULL) DROP TABLE dbo.t1;
GO
CREATE table dbo.t1 (a INT);
GO

PRINT N'-------- [Test A] ---- OFF ----';
PRINT N'[A.01] Now, SET IMPLICIT_TRANSACTIONS OFF.';
PRINT N'[A.02] @@TRANCOUNT, at start, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
SET IMPLICIT_TRANSACTIONS OFF;
GO
INSERT INTO dbo.t1 VALUES (11);
INSERT INTO dbo.t1 VALUES (12);
PRINT N'[A.03] @@TRANCOUNT, after INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO

PRINT N' ';
PRINT N'-------- [Test B] ---- ON ----';
PRINT N'[B.01] Now, SET IMPLICIT_TRANSACTIONS ON.';
PRINT N'[B.02] @@TRANCOUNT, at start, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
SET IMPLICIT_TRANSACTIONS ON;
GO
INSERT INTO dbo.t1 VALUES (21);
INSERT INTO dbo.t1 VALUES (22);
PRINT N'[B.03] @@TRANCOUNT, after INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
COMMIT TRANSACTION;
PRINT N'[B.04] @@TRANCOUNT, after COMMIT, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO

PRINT N' ';
PRINT N'-------- [Test C] ---- ON, then BEGIN TRAN ----';
PRINT N'[C.01] Now, SET IMPLICIT_TRANSACTIONS ON.';
PRINT N'[C.02] @@TRANCOUNT, at start, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
SET IMPLICIT_TRANSACTIONS ON;
GO
BEGIN TRANSACTION;
INSERT INTO dbo.t1 VALUES (31);
INSERT INTO dbo.t1 VALUES (32);
PRINT N'[C.03] @@TRANCOUNT, after INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
COMMIT TRANSACTION;
PRINT N'[C.04] @@TRANCOUNT, after a COMMIT, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
COMMIT TRANSACTION;
PRINT N'[C.05] @@TRANCOUNT, after another COMMIT, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO

PRINT N' ';
PRINT N'-------- [Test D] ---- ON, INSERT, BEGIN TRAN, INSERT ----';
PRINT N'[D.01] Now, SET IMPLICIT_TRANSACTIONS ON.';
PRINT N'[D.02] @@TRANCOUNT, at start, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
SET IMPLICIT_TRANSACTIONS ON;
GO
INSERT INTO dbo.t1 VALUES (41);
BEGIN TRANSACTION;
INSERT INTO dbo.t1 VALUES (42);
PRINT N'[D.03] @@TRANCOUNT, after INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO
COMMIT TRANSACTION;
PRINT N'[D.04] @@TRANCOUNT, after a COMMIT, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
COMMIT TRANSACTION;
PRINT N'[D.05] @@TRANCOUNT, after another COMMIT, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
GO

-- Clean up.
SET IMPLICIT_TRANSACTIONS OFF;
GO
WHILE (@@TRANCOUNT > 0) COMMIT TRANSACTION;
GO
DROP TABLE dbo.t1;
GO

Далее приводятся текстовые выходные данные из предыдущего сценария Transact-SQL.

-------- [Test A] ---- OFF ----
[A.01] Now, SET IMPLICIT_TRANSACTIONS OFF.
[A.02] @@TRANCOUNT, at start, == 0
[A.03] @@TRANCOUNT, after INSERTs, == 0

-------- [Test B] ---- ON ----
[B.01] Now, SET IMPLICIT_TRANSACTIONS ON.
[B.02] @@TRANCOUNT, at start, == 0
[B.03] @@TRANCOUNT, after INSERTs, == 1
[B.04] @@TRANCOUNT, after COMMIT, == 0

-------- [Test C] ---- ON, then BEGIN TRAN ----
[C.01] Now, SET IMPLICIT_TRANSACTIONS ON.
[C.02] @@TRANCOUNT, at start, == 0
[C.03] @@TRANCOUNT, after INSERTs, == 2
[C.04] @@TRANCOUNT, after a COMMIT, == 1
[C.05] @@TRANCOUNT, after another COMMIT, == 0

-------- [Test D] ---- ON, INSERT, BEGIN TRAN, INSERT ----
[D.01] Now, SET IMPLICIT_TRANSACTIONS ON.
[D.02] @@TRANCOUNT, at start, == 0
[D.03] @@TRANCOUNT, after INSERTs, == 2
[D.04] @@TRANCOUNT, after a COMMIT, == 1
[D.05] @@TRANCOUNT, after another COMMIT, == 0