自动提交事务

自动提交模式是 SQL Server 数据库引擎的默认事务管理模式。每个 Transact-SQL 语句在完成时,都被提交或回滚。如果一个语句成功地完成,则提交该语句;如果遇到错误,则回滚该语句。只要没有显式事务或隐性事务覆盖自动提交模式,与数据库引擎实例的连接就以此默认模式操作。自动提交模式也是 ADO、OLE DB、ODBC 和 DB 库的默认模式。

在 BEGIN TRANSACTION 语句启动显式事务隐性事务设置为开启之前,与数据库引擎实例的连接一直以自动提交模式操作。当提交或回滚显式事务或关闭隐性事务模式时,连接将返回到自动提交模式。

如果设置为 ON,SET IMPLICIT_TRANSACTIONS 会将连接设置为隐式事务模式。如果设置为 OFF,则使连接恢复为自动提交事务模式。

编译和运行时错误

在自动提交模式下,有时看起来好像数据库引擎实例回滚了整个批处理而不是仅仅一个 SQL 语句。当遇到的错误是编译错误而非运行时错误时,会发生这种情况。编译错误会阻止数据库引擎生成执行计划,这样批处理中的任何语句都不会执行。尽管看起来好像是回滚了产生错误的语句之前的所有语句,但该错误阻止了批处理中的所有语句的执行。在下面的示例中,由于发生编译错误,第三个批处理中的 INSERT 语句都没有执行。但看起来好像是前两个 INSERT 语句没有执行便进行了回滚。

USE AdventureWorks2008R2;
GO
CREATE TABLE TestBatch (Cola INT PRIMARY KEY, Colb CHAR(3));
GO
INSERT INTO TestBatch VALUES (1, 'aaa');
INSERT INTO TestBatch VALUES (2, 'bbb');
INSERT INTO TestBatch VALUSE (3, 'ccc');  -- Syntax error.
GO
SELECT * FROM TestBatch;  -- Returns no rows.
GO

在下面的示例中,第三个 INSERT 语句产生运行时重复主键错误。由于前两个 INSERT 语句成功地执行并且提交,因此它们在运行时错误之后被保留下来。

USE AdventureWorks2008R2;
GO
CREATE TABLE TestBatch (Cola INT PRIMARY KEY, Colb CHAR(3));
GO
INSERT INTO TestBatch VALUES (1, 'aaa');
INSERT INTO TestBatch VALUES (2, 'bbb');
INSERT INTO TestBatch VALUES (1, 'ccc');  -- Duplicate key error.
GO
SELECT * FROM TestBatch;  -- Returns rows 1 and 2.
GO

数据库引擎使用延迟的名称解析,直到执行时才解析对象名称。在下面的示例中,执行并提交了前两个 INSERT 语句,在第三个 INSERT 语句由于引用一个不存在的表而产生运行时错误之后,这两行仍然保留在 TestBatch 表中。

USE AdventureWorks2008R2;
GO
CREATE TABLE TestBatch (Cola INT PRIMARY KEY, Colb CHAR(3));
GO
INSERT INTO TestBatch VALUES (1, 'aaa');
INSERT INTO TestBatch VALUES (2, 'bbb');
INSERT INTO TestBch VALUES (3, 'ccc');  -- Table name error.
GO
SELECT * FROM TestBatch;  -- Returns rows 1 and 2.
GO

请参阅

概念