TSQL使用transaction创建触发器并尝试catch块

时间:2010-06-28 08:35:14

标签: tsql triggers transactions try-catch

我对触发器中的事务有一些疑问,但我还没有找到答案。

CREATE TRIGGER A_AI ON A
AFTER INSERT AS

    BEGIN TRY --is the try block 1 transaction ? or do I have to begin the transaction?

        --BEGIN TRAN: may I start the transaction like this?
        -- SOME DANGEROUS OPERATIONS

        COMMIT --has this sense here?
    END TRY
    BEGIN CATCH --silent catch no rasing errors.
        ROLLBACK TRANSACTION -- does it work without BEGIN TRANSACTION? if so, is it the whole try block?
    END CATCH

GO

1 个答案:

答案 0 :(得分:5)

触发器总是在事务的上下文中执行 - 每个DML语句都在事务中运行。在SQL Server中将Implicit Transactions设置为commit automatically这一事实通常会隐藏这一点。

如果从触发器内发出回滚,这将(与往常一样使用回滚)回滚所有事务,无论是否嵌套。

一般情况下,你不会在触发器中提交,除非(如在你注释掉的例子中)你明确地打开一个嵌套事务。

如果您的问题还有其他方面,我将无法弄清楚您发布的示例中的内容。虽然我总是喜欢在询问SQL问题时发布实际SQL的人,但有时候一些评论或实际问题的项目符号列表都可以提供帮助。