Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Применимо к: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)