嵌套存储过程中包含的 TransactionScope 和事务

TransactionScope and transactions included in nested stored procedures

我在我的 C# 代码中使用了 TransactionScope。我会尽量简化。

public void ProcessStrings(...)
{
    ...
    using (TransactionScope transactionScope = new TransactionScope())
    {
        ...
        if(someCondition)  
        {   
            try
            {  
                DeleteSomeStrings(...);
            }
            catch(Exception ex)
            {
                //log error
                ...
                throw;
            }
        }

        ...

        try
        {
            UpdateSomeStrings(...);
        }
        catch(Exception ex)
        {
            //log error
            ...
            throw;
        }

        ...

        transactionScope.Complete();
    }
    ...
}

DeleteSomeStringsUpdateSomeStrings方法通过ADO.NET调用两个存储过程。我还需要对这些存储过程使用显式事务处理,因为它们也会从其他上下文中调用:

CREATE PROCEDURE [dbo].[DeleteSomeStrings]
...
--parameter list
...
AS
BEGIN TRY

    BEGIN TRAN
    ...
    COMMIT TRAN
END TRY

BEGIN CATCH
    ...
    ROLLBACK 
    ...
    RAISERROR(...)
END CATCH

第二个结构类似:

CREATE PROCEDURE [dbo].[UpdateSomeStrings]
...
--parameter list
...
AS
BEGIN TRY

    BEGIN TRAN
    ...
    COMMIT TRAN
END TRY

BEGIN CATCH
    ...
    ROLLBACK 
    ...
    RAISERROR(...)
END CATCH

问题是当 DeleteSomeStrings 成功而 UpdateSomeStrings 失败时,在 DeleteSomeStrings 中处理的数据仍然会被提交。在这种情况下,似乎忽略了 TransactionScope。我希望一切都回滚。这是正常行为吗?如果是,为什么?

设法通过使用 SqlTransaction 而不是 TransactionScope 并将相同的连接和事务传递给所使用的命令对象来使其工作执行这两个存储过程。它接缝 TransactionScope 不能在这种情况下使用。感谢您的评论。