Transact-SQL 参考

SAVE TRANSACTION

在事务内设置保存点。

语法

SAVE TRAN [ SACTION ] { savepoint_name | @savepoint_variable }

参数

savepoint_name

是指派给保存点的名称。保存点名称必须符合标识符规则,但只使用前 32 个字符。

@savepoint_variable

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

注释

用户可以在事务内设置保存点或标记。保存点定义如果有条件地取消事务的一部分,事务可以返回的位置。如果将事务回滚到保存点,则必须(如果需要,使用更多的 Transact-SQL 语句和 COMMIT TRANSACTION 语句)继续完成事务,或者必须(通过将事务回滚到其起始点)完全取消事务。若要取消整个事务,请使用 ROLLBACK TRANSACTION transaction_name 格式。这将撤消事务的所有语句和过程。

在由 BEGIN DISTRIBUTED TRANSACTION 显式启动或从本地事务升级而来的分布式事务中,不支持 SAVE TRANSACTION。

重要  当事务开始时,将一直控制事务中所使用的资源直到事务完成(也就是锁定)。当将事务的一部分回滚到保存点时,将继续控制资源直到事务完成(或者回滚全部事务)。

权限

默认情况下,将 SAVE TRANSACTION 权限授予任何有效用户。

示例

下例更改分给 The Gourmet Microwave 的两位作者的版税。数据库将会在两个更新间不一致,因此必须将它们分组为用户定义的事务。

BEGIN TRANSACTION royaltychange
   UPDATE titleauthor
      SET royaltyper = 65
         FROM titleauthor, titles
            WHERE royaltyper = 75
               AND titleauthor.title_id = titles.title_id
               AND title = 'The Gourmet Microwave'
   UPDATE titleauthor
      SET royaltyper = 35
         FROM titleauthor, titles
            WHERE royaltyper = 25
               AND titleauthor.title_id = titles.title_id
               AND title = 'The Gourmet Microwave'
SAVE TRANSACTION percentchanged

/* 
After having updated the royaltyper entries for the two authors, the 
user inserts the savepoint percentchanged, and then determines how a 
10-percent increase in the book's price would affect the authors' royalty earnings. 
*/

UPDATE titles
   SET price = price * 1.1
      WHERE title = 'The Gourmet Microwave'
SELECT (price * royalty * ytd_sales) * royaltyper
   FROM titles, titleauthor
      WHERE title = 'The Gourmet Microwave'
         AND titles.title_id = titleauthor.title_id
/* 
The transaction is rolled back to the savepoint
with the ROLLBACK TRANSACTION statement. 
*/

ROLLBACK TRANSACTION percentchanged
COMMIT TRANSACTION

/* End of royaltychange. */

请参见

批处理

BEGIN TRANSACTION

COMMIT TRANSACTION

COMMIT WORK

CREATE PROCEDURE

CREATE TRIGGER

DELETE

INSERT

ROLLBACK TRANSACTION

ROLLBACK WORK

SELECT

事务保存点

UPDATE