存储过程中的事务+客户端代码

时间:2011-09-28 17:41:38

标签: c# .net sql-server transactionscope

我有一个SQL Server存储过程,它创建一个像这样的TRANSACTION:

BEGIN TRY
    BEGIN TRANSACTION

    INSERT INTO Table1 ...
    INSERT INTO Table2 ...

    COMMIT
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0
        ROLLBACK
END CATCH

此存储过程将插入两个单独的表中。如果其中一个失败,它将会回滚。

我还有以下创建事务范围的.net代码:

using( var scope = new TransactionScope() )
{
    SqlCommand cmd1 = connection.CreateCommand(); 
    SqlCommand cmd2 = connection.CreateCommand();

    // ...

    cmd1.ExecuteNonQuery();
    cmd2.ExecuteNonQuery();

    scope.Complete();
}

如果我的存储过程和代码都在创建事务,会发生什么?这是否会导致问题/需要成为分布式事务,或者只要我只创建一个与数据库的连接就可以了吗?

2 个答案:

答案 0 :(得分:3)

除非你有充分的理由,否则我只会在一个地方或另一个地方进行交易。

如果可能的话,我会把那个地方当成数据库。这减少了往返次数,更容易测试,将其与系统的其他组件隔离,减少了暴露的数据库表面区域,并通过强制操作通过定义明确的界面来保护数据库边界的完整性。

答案 1 :(得分:0)

在这种情况下,如果您的某个存储过程失败,它将使用内部事务回滚。您的代码将认为它已完成并提交分布式事务。这是你想要的,因为分散的交易毫无意义,因为每个交易都会单独运行。

如果您想要同时运行或两者都不运行,请从存储的过程中删除您的事务,并使用分布式事务。