如何处理存储过程中的嵌套事务

时间:2015-03-06 12:28:13

标签: sql-server tsql

我有类似下面的代码,现在我只需要提交内部事务,外部事务可以提交或回滚。如何处理?

    BEGIN TRY
        BEGIN TRANSACTION

        INSERT TABLE T1 (1,2,3)


            ----
            ----
            ----

        IF t1 > 10
        BEGIN
            BEGIN TRANSACTION
            INSERT INTO ERROR_LOG  (XX)
            COMMIT 
            return 1
        END 
    COMMIT 
    END TRY 
    BEGIN CATCH
            ROLLBACK

    END CATCH

仅当t1> 10然后事务应提交错误日志并终止程序

1 个答案:

答案 0 :(得分:2)

如果您希望将某些结果存储到ERROR_LOG并回滚其他更改,则内部事务不会这样做,因为在SQL Server中,外部事务将回滚所有内容。

这里有一些测试& Paul Randal的解释:http://www.sqlskills.com/blogs/paul/a-sql-server-dba-myth-a-day-2630-nested-transactions-are-real/

解决此限制的一种方法是使用表变量进行日志记录,因为它不会回滚,然后在执行回滚后将结果插入日志中。