Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Применимо к: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 первым:
ALTER TABLEBEGIN TRANSACTIONCREATEDELETEDROPFETCHGRANTINSERTMERGEOPENREVOKE-
SELECT(См. уточняющее замечание) TRUNCATE TABLEUPDATE
Когда 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
Связанный контент
- Инструкция ALTER TABLE (Transact-SQL)
- НАЧАЛО ТРАНЗАКЦИИ (Transact-SQL)
- CREATE TABLE (Transact-SQL)
- УДАЛИТЬ (Transact-SQL)
- ТАБЛИЦА СБРОСОВ (Transact-SQL)
- FETCH (Transact-SQL)
- ГРАНТ (Transact-SQL)
- ВСТАВЬТЕ (Transact-SQL)
- СЛИЯНИЕ (Transact-SQL)
- ОТКРЫТЬ (Transact-SQL)
- РЕВОК (Transact-SQL)
- SELECT (Transact-SQL)
- Инструкции SET (Transact-SQL)
- НАБОР ANSI_DEFAULTS (Transact-SQL)
- @@TRANCOUNT (Transact-SQL)
- ТАБЛИЦА ПОДСЧЁТА (Transact-SQL)
- ОБНОВЛЕНИЕ (Transact-SQL)