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

本文关键字:事务 代码 客户端 存储过程 | 更新日期: 2023-09-27 18:10:09

我有一个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();
}

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

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

除非你有很好的理由,否则我只会在其中一个地方进行交易。

如果可能的话,我会让那个地方成为数据库。这减少了往返,更容易测试,将其与系统的其他组件隔离,减少了暴露的数据库表面积,并通过强制操作通过定义良好的接口来保护数据库周界的完整性。

在这个场景中,如果一个存储过程失败,它将使用内部事务回滚。您的代码将认为它已经完成并提交分布式事务。这是你想要的吗,因为分布式事务是毫无意义的,因为每个事务都将单独运行。

如果您希望两者都运行或都不运行,请将事务从存储过程中删除,只使用分布式事务。