【问题标题】:TransactionScope and transactions included in nested stored proceduresTransactionScope 和嵌套存储过程中包含的事务
【发布时间】:2015-06-24 13:43:56
【问题描述】:

我在我的 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 被忽略了。我希望一切都会回滚。这是正常行为吗?如果是,为什么?

【问题讨论】:

  • 在执行第一个存储过程时,尝试使用rowsAffected = cmd.ExecuteNonQuery(); 如果rowsAffexted 为零,则执行第二个SP 没有意义

标签: c# .net sql-server tsql transactions


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多