Transact-SQL 参考

BEGIN TRANSACTION

标记一个显式本地事务的起始点。BEGIN TRANSACTION将 @@TRANCOUNT 加 1。

语法

BEGIN TRAN [ SACTION ] [ transaction_name | @tran_name_variable
    [ WITH MARK [ 'description' ] ] ]

参数

transaction_name

是给事务分配的名称。transaction_name 必须遵循标识符规则,但是不允许标识符多于 32 个字符。仅在嵌套的 BEGIN...COMMIT 或 BEGIN...ROLLBACK 语句的最外语句对上使用事务名。

@tran_name_variable

是用户定义的、含有有效事务名称的变量的名称。必须用 charvarcharncharnvarchar 数据类型声明该变量。

WITH MARK ['description']

指定在日志中标记事务。Description 是描述该标记的字符串。

如果使用了 WITH MARK,则必须指定事务名。WITH MARK 允许将事务日志还原到命名标记。

注释

BEGIN TRANSACTION 代表一点,由连接引用的数据在该点是逻辑和物理上都一致的。如果遇上错误,在 BEGIN TRANSACTION 之后的所有数据改动都能进行回滚,以将数据返回到已知的一致状态。每个事务继续执行直到它无误地完成并且用 COMMIT TRANSACTION 对数据库作永久的改动,或者遇上错误并且用 ROLLBACK TRANSACTION 语句擦除所有改动。

BEGIN TRANSACTION 为使用本语句的连接启动一个本地事务。根据当前事务隔离级别的设置情况,为支持该连接所发出的 Transact-SQL 语句而获取的许多资源被该事务锁定,直到此事务以 COMMIT TRANSACTION 或 ROLLBACK TRANSACTION 语句完成。长时间处于等待处理状态的事务会阻止其他用户访问锁定的资源。

虽然 BEGIN TRANSACTION 启动一个本地事务,但是在应用程序接下来执行了一个必须记录的操作(如执行 INSERT、UPDATE 或 DELETE 语句)之前,它并不被记录在事务日志中。应用程序能执行一些操作,例如为了保护 SELECT 语句的事务隔离级别而获取锁,但是直到应用程序执行一个修改操作日志中才有记录。

在一系列嵌套的事务中用一个事务名给多个事务命名对该事务没有什么影响。系统仅登记第一个(最外部的)事务名。回滚到其它任何名字(有效的保存点名除外)都会产生错误。事实上,任何在回滚之前执行的语句都没有在错误发生时回滚。这些语句仅当外层的事务回滚时才会进行回滚。

BEGIN TRANSACTION 启动一个本地事务。如果在事务提交或回滚之前执行了如下操作,本地事务将升级到分布式事务:

SQL Server 的本地复本成为事务控制器并且使用 MS DTC 来管理该分布式事务。

标记事务

WITH MARK 选项使事务名置于事务日志中。将数据库还原到早期状态时,可使用标记事务替代日期和时间。有关更多信息,请参见将数据库还原到前一个状态恢复到命名事务RESTORE

另外,若要将一组相关数据库恢复到逻辑上一致的状态,必须使用事务日志标记。标记可由分布式事务置于相关数据库的事务日志中。将这组相关数据库恢复到这些标记将产生一组在事务上一致的数据库。在相关数据库中放置标记需要特殊的过程。有关更多信息,请参见"相关数据库的备份和恢复"。

只有当数据库由标记事务更新时,才在事务日志中放置标记。不修改数据的事务不被标记。

在已存在的未标记事务中可以嵌套 BEGIN TRAN new_name WITH MARK。嵌套后,new_name 便成为事务的标记名,不论是否已为事务提供了该名称。在下例中,M2 是标记名。

BEGIN TRAN T1
UPDATE table1 ...
BEGIN TRAN M2 WITH MARK
UPDATE table2 ...
SELECT * from table1
COMMIT TRAN M2
UPDATE table3 ...
COMMIT TRAN T1

尝试标记已标记的事务将产生警告(非错误)消息:

BEGIN TRAN T1 WITH MARK
UPDATE table1 ...
BEGIN TRAN M2 WITH MARK

Server: Msg 3920, Level 16, State 1, Line 3
WITH MARK option only applies to the first BEGIN TRAN WITH MARK.
The option is ignored.
权限

任何有效的用户都具有默认的 BEGIN TRANSACTION 权限。

示例
A. 命名事务

下例说明如何命名事务。提交命名事务后,为所有畅销计算机书籍支付的版税增加 10%。

DECLARE @TranName VARCHAR(20)
SELECT @TranName = 'MyTransaction'

BEGIN TRANSACTION @TranName
GO
USE pubs
GO
UPDATE roysched
SET royalty = royalty * 1.10
WHERE title_id LIKE 'Pc%'
GO

COMMIT TRANSACTION MyTransaction
GO
B. 标记事务

下例说明如何标记事务。标记名为"RoyaltyUpdate"的事务。

BEGIN TRANSACTION RoyaltyUpdate 
   WITH MARK 'Update royalty values'
GO
USE pubs
GO
UPDATE roysched
   SET royalty = royalty * 1.10
   WHERE title_id LIKE 'Pc%'
GO
COMMIT TRANSACTION RoyaltyUpdate
GO

请参见

BEGIN DISTRIBUTED TRANSACTION

COMMIT TRANSACTION

COMMIT WORK

RESTORE

恢复到命名事务

ROLLBACK TRANSACTION

ROLLBACK WORK

SAVE TRANSACTION

事务