SET IMPLICIT_TRANSACTIONS (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
请参阅
参考
BEGIN TRANSACTION (Transact-SQL)