使用包含 COMMIT 或 ROLLBACK TRANSACTION 的 DML 触发器

在 Microsoft SQL Server 2000 和 SQL Server 2005 中,事务计数仅当语句开始时事务计数为 0 的情况下在才会在语句中增加。在 SQL Server 7.0 中,无论语句开始时的事务计数如何,事务计数都会增加。与在 SQL Server 7.0 中相比,在 SQL Server 2000 和 SQL Server 2005 中,TRANCOUNT 在触发器中返回的值可能更小。

在 SQL Server 2000 和 SQL Server 2005 中,如果在触发器中执行 COMMIT TRANSACTION 或 COMMIT WORK 语句,并且在触发器启动时没有对应的显式或隐式 BEGIN TRANSACTION 语句,则用户可能会看到不同于 SQL Server 7.0 中的行为。建议不要将 COMMIT TRANSACTION 或 COMMIT WORK 语句放置在触发器中。

当包含 ROLLBACK TRANSACTION 语句的触发器在批处理中执行时,它们会取消整个批处理。在 SQL Server 2005 中,也会返回错误。

在以下示例中,如果 INSERT 语句触发了包含 ROLLBACK TRANSACTION 的 DML 触发器,则 DELETE 语句将由于批处理被取消而无法执行:

/* Start of Batch */
INSERT employee VALUES ('XYZ12345M', 'New', 'M', 'Employee', 1, 1, '9952', '6/1/95') -- Causes trigger to fire and ROLLBACK TRANSACTION.
DELETE employee WHERE emp_id = 'PMA42628M'
GO

如果在用户定义的事务中触发包含 ROLLBACK TRANSACTION 语句的触发器,则 ROLLBACK TRANSACTION 将回滚整个事务。在以下示例中,如果 INSERT 语句触发了包含 ROLLBACK TRANSACTION 的触发器,则 UPDATE 语句也将回滚:

/* Start of Transaction */
BEGIN TRANSACTION
UPDATE employee SET hire_date = '7/1/94' WHERE emp_id = 'VPA30890F'
INSERT employee VALUES ('XYZ12345M', 'New', 'M', 'Employee', 1, 1, '9952', '6/1/95') -- Causes trigger to fire and ROLLBACK TRANSACTION.

请参阅

概念

在存储过程和触发器中回滚和提交
事务(数据库引擎)

其他资源

ROLLBACK TRANSACTION (Transact-SQL)

帮助和信息

获取 SQL Server 2005 帮助