SET IMPLICIT_TRANSACTIONS (Transact-SQL)SET IMPLICIT_TRANSACTIONS (Transact-SQL)

ОБЛАСТЬ ПРИМЕНЕНИЯ: даSQL Server даБаза данных SQL Azure даAzure Synapse Analytics (хранилище данных SQL) даParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse

Устанавливает неявный режим BEGIN TRANSACTION для подключения.Sets the BEGIN TRANSACTION mode to implicit, for the connection.

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

СинтаксисSyntax

SET IMPLICIT_TRANSACTIONS { ON | OFF }  

RemarksRemarks

Если установлено значение ON, система находится в неявном режиме транзакции.When ON, the system is in implicit transaction mode. Это означает, что если @@TRANCOUNT = 0, любая из следующих инструкций Transact-SQL начинает новую транзакцию.This means that if @@TRANCOUNT = 0, any of the following Transact-SQL statements begins a new transaction. Это эквивалентно выполнению невидимой инструкции BEGIN TRANSACTION:It is equivalent to an unseen BEGIN TRANSACTION being executed first:

ALTER TABLEALTER TABLE FETCHFETCH REVOKEREVOKE
BEGIN TRANSACTIONBEGIN TRANSACTION GRANTGRANT SELECT (См. исключение ниже.)SELECT (See exception below.)
CREATECREATE INSERTINSERT TRUNCATE TABLETRUNCATE TABLE
DELETEDELETE OPENOPEN UPDATEUPDATE
DROPDROP .. ..

Если задано значение OFF, каждая из предыдущих инструкций T-SQL ограничена невидимыми инструкциями BEGIN TRANSACTION и COMMIT TRANSACTION.When OFF, each of the preceding T-SQL statements is bounded by an unseen BEGIN TRANSACTION and an unseen COMMIT TRANSACTION statement. При значении OFF транзакция выполняется в режиме автофиксации.When OFF, we say the transaction mode is autocommit. Если ваш код T-SQL выдает видимую инструкцию BEGIN TRANSACTION, транзакция выполняется в явном режиме.If your T-SQL code visibly issues a BEGIN TRANSACTION, we say the transaction mode is explicit.

Необходимо понимать несколько важных моментов.There are several clarifying points to understand:

  • Когда транзакция выполняется в неявном режиме, невидимая инструкция BEGIN TRANSACTION не выдается, если @@trancount уже > 0.When the transaction mode is implicit, no unseen BEGIN TRANSACTION is issued if @@trancount > 0 already. Тем не менее все явные инструкции BEGIN TRANSACTION по-прежнему имеют шаг приращения @@TRANCOUNT.However, any explicit BEGIN TRANSACTION statements still increment @@TRANCOUNT.

  • После завершения инструкции INSERT и остальных единиц работы необходимо выполнить инструкции COMMIT TRANSACTION, пока @@TRANCOUNT не вернется к значению 0.When your INSERT statements and anything else in your unit of work is finished, you must issue COMMIT TRANSACTION statements until @@TRANCOUNT is decremented back down to 0. Или выполнить одну инструкцию ROLLBACK TRANSACTION.Or you can issue one ROLLBACK TRANSACTION.

  • Инструкции SELECT, которые не производят выборку из таблицы, не запускают неявные транзакции.SELECT statements that do not select from a table do not start implicit transactions. Например, SELECT GETDATE(); или SELECT 1, 'ABC'; не требуют транзакций.For example SELECT GETDATE(); or SELECT 1, 'ABC'; do not require transactions.

  • Неявные транзакции могут неожиданно получить значение ON в связи со значениями по умолчанию ANSI.Implicit transactions may unexpectedly be ON due to ANSI defaults. Дополнительные сведения см. в разделе SET ANSI_DEFAULTS (Transact-SQL).For details see SET ANSI_DEFAULTS (Transact-SQL).

    Инструкция IMPLICIT_TRANSACTIONS ON не пользуется популярностью.IMPLICIT_TRANSACTIONS ON is not popular. В большинстве случаев значение ON для параметра IMPLICIT_TRANSACTIONS возникает из-за выбора SET ANSI_DEFAULTS ON.In most cases where IMPLICIT_TRANSACTIONS is ON, it is because the choice of SET ANSI_DEFAULTS ON has been made.

  • Поставщик OLE DB для Native Client SQL ServerSQL Server для SQL ServerSQL Server и драйвер ODBC для Native Client SQL ServerSQL Server при соединении автоматически устанавливают для параметра IMPLICIT_TRANSACTIONS значение OFF.The SQL ServerSQL Server Native Client OLE DB Provider for SQL ServerSQL Server, and the SQL ServerSQL Server Native Client ODBC driver, automatically set IMPLICIT_TRANSACTIONS to OFF when connecting. SET IMPLICIT_TRANSACTIONS по умолчанию устанавливается в значение OFF для соединений с управляемым поставщиком SQLClient и SOAP-запросов, получаемых через конечные точки протокола HTTP.SET IMPLICIT_TRANSACTIONS defaults to OFF for connections with the SQLClient managed provider, and for SOAP requests received through HTTP endpoints.

Чтобы просмотреть текущее значение параметра для IMPLICIT_TRANSACTIONS, выполните следующий запрос.To view the current setting for IMPLICIT_TRANSACTIONS, run the following query.

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

ПримерыExamples

Следующий сценарий Transact-SQL запускает несколько разных тестовых случаев.The following Transact-SQL script runs a few different test cases. Также предоставляются текстовые выходные данные, подробно описывающие поведение и результаты в каждом тестовом случае.The text output is also provided, which shows the detailed behavior and results from each test case.

-- Transact-SQL.  
go  
-- 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 INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));  
COMMIT TRANSACTION;  
PRINT N'[D.05] @@TranCount, after INSERTs, == ' + 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.Next is the text output from the preceding Transact-SQL script.

-- Text output from 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 INSERTs, == 1  
[D.05] @@TranCount, after INSERTs, == 0  

Результирующий набор:Here is the result set.

См. также:See Also

ALTER TABLE (Transact-SQL) ALTER TABLE (Transact-SQL)
BEGIN TRANSACTION (Transact-SQL) BEGIN TRANSACTION (Transact-SQL)
CREATE TABLE (Transact-SQL) CREATE TABLE (Transact-SQL)
DELETE (Transact-SQL) DELETE (Transact-SQL)
DROP TABLE (Transact-SQL) DROP TABLE (Transact-SQL)
FETCH (Transact-SQL) FETCH (Transact-SQL)
GRANT (Transact-SQL) GRANT (Transact-SQL)
INSERT (Transact-SQL) INSERT (Transact-SQL)
OPEN (Transact-SQL) OPEN (Transact-SQL)
REVOKE (Transact-SQL) REVOKE (Transact-SQL)
SELECT (Transact-SQL) SELECT (Transact-SQL)
Инструкции SET (Transact-SQL) SET Statements (Transact-SQL)
SET ANSI_DEFAULTS (Transact-SQL) SET ANSI_DEFAULTS (Transact-SQL)
@@TRANCOUNT (Transact-SQL) @@TRANCOUNT (Transact-SQL)
TRUNCATE TABLE (Transact-SQL) TRUNCATE TABLE (Transact-SQL)
UPDATE (Transact-SQL)UPDATE (Transact-SQL)