t-sql - 我是否必须在 T-SQL 中的 catch block 中回滚事务之前对事务进行计数?

标签 t-sql sql-server-2008 stored-procedures error-handling transactions

我在 SQL Server 2008 的每个存储过程的末尾都有下一个 block

BEGIN TRY
    BEGIN TRAN
        -- my code
    COMMIT
END TRY
BEGIN CATCH
    IF (@@trancount > 0)
    BEGIN
        ROLLBACK
        DECLARE @message NVARCHAR(MAX)
        DECLARE @state INT
        SELECT @message = ERROR_MESSAGE(), @state = ERROR_STATE()
        RAISERROR (@message, 11, @state)
    END
END CATCH

是否可以将CATCH-block切换为

BEGIN CATCH
    ROLLBACK
    DECLARE @message NVARCHAR(MAX)
    DECLARE @state INT
    SELECT @message = ERROR_MESSAGE(), @state = ERROR_STATE()
    RAISERROR (@message, 11, @state)
END CATCH

或者只是

BEGIN CATCH
    ROLLBACK
END CATCH

最佳答案

实际上,如果我已经进行过交易,我就不会开始新的交易。

这涉及嵌套存储过程、分布式 TXN 和 TransactionScope

记住,有no such thing as a nested transaction in SQL Server反正。

DECLARE @StartTranCount int

BEGIN TRY
    SET @StartTranCount = @@TRANCOUNT
    IF @StartTranCount = 0 BEGIN TRAN
        -- my code
    IF @StartTranCount = 0 COMMIT TRAN
END TRY
BEGIN CATCH
    IF @StartTranCount = 0 AND @@trancount > 0
    BEGIN
        ROLLBACK TRAN
        DECLARE @message NVARCHAR(MAX)
        DECLARE @state INT
        SELECT @message = ERROR_MESSAGE(), @state = ERROR_STATE()
        RAISERROR (@message, 11, @state)
    END
    /*
    or just
    IF @StartTranCount = 0 AND @@trancount  
        ROLLBACK TRAN
    */
END CATCH

关于t-sql - 我是否必须在 T-SQL 中的 catch block 中回滚事务之前对事务进行计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2797289/

相关文章:

sql-server - 合并更新插入而不违反唯一约束

c# - 无法将 T-SQL INNER JOIN 转换为 LINQ-Entities 查询

t-sql - 合并 - 匹配时则不执行任何操作

SQL Server - 复杂的动态数据透视列

MySQL 存储过程不会获取整个表

mysql - 灵活的mysql表的动态内容解决方案

sql - 动态sql脚本生成删除表语句列表

SQL Server : SELECT from multiple lines if values exist

SQL Server 创建表错误 - 可能导致循环或多级联路径

java - 使用基于java的正则表达式查询Oracle