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

标签 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();
}

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

最佳答案

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

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

关于c# - 存储过程中的事务 + 客户端代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7587298/

相关文章:

c# - 如何确定一个值是否与另一个值几乎相同(例如街道缩写)?

c++ - SQL Server 2012 通过 native C++(无 ATL)从 Windows 首选访问方法

c# - 为什么 Visual Studio 项目仅限于一种语言?

c# - 这个 `private set` 在这个不可变类中有什么区别

c# - 使用 C# 进行 URL 编码

sql - TSQL 在 IN 运算符中获取丢失的记录

sql-server - 为什么要收缩 sql server 2005 数据库?

c# - 我应该使用一个 LINQ DataContext 还是多个?

c# - 冲洗 System.Console.Read()

c# - WCF:无法添加服务。服务元数据可能无法访问。确保您的服务正在运行并公开元数据