SET IMPLICIT_TRANSACTIONS (Transact-SQL)

将连接设置为隐式事务模式。

主题链接图标 Transact-SQL 语法约定

语法

SET IMPLICIT_TRANSACTIONS { ON | OFF }

注释

如果设置为 ON,SET IMPLICIT_TRANSACTIONS 将连接设置为隐式事务模式。 如果设置为 OFF,则使连接恢复为自动提交事务模式。 由于 ANSI 默认值的原因,隐式事务可能会意外地打开。 SET 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 Native Client OLE DB Provider for SQL Server 和 SQL Server Native Client ODBC 驱动程序会自动将 IMPLICIT_TRANSACTIONS 设置为 OFF。 对于与 SQLClient 托管提供程序的连接以及通过 HTTP 端点接收的 SOAP 请求,SET IMPLICIT_TRANSACTIONS 默认为 OFF。

如果 SET ANSI_DEFAULTS 为 ON,则 SET IMPLICIT_TRANSACTIONS 也为 ON。

当 SET IMPLICIT_TRANSACTIONS 为 ON 时执行 BEGIN TRANSACTION 语句会导致打开两个嵌套的事务。 每当事务是活动的时候,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 (Transact-SQL)

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)