【问题标题】:Do transactions have to be in Stored Procedures in SQL Server?事务必须在 SQL Server 的存储过程中吗?
【发布时间】:2011-07-07 00:26:12
【问题描述】:

我有一堆更新和插入查询,我从我的 C# 代码中调用这些查询需要在事务中。我更愿意将它们保留在 C# 中,而不是使用存储过程。我使用 SQLCommand.ExecuteNonQuery() 开始并提交事务。在我尝试提交事务之前它工作正常,当我收到一条消息“COMMIT TRANSACTION 请求没有相应的 BEGIN TRANSACTION”时。我正在关闭通话之间的连接。是这个问题吗?

【问题讨论】:

    标签: c# .net sql-server sql-server-2008


    【解决方案1】:

    不,他们没有。

    如果您希望事务跨越数据库连接甚至不同的数据库(分布式事务),可以直接在连接本身上控制 C# 中的事务,或者使用 System.Transactions 命名空间使用环境事务。

    如果您要关闭调用之间的连接,请使用 System.Transactions 命名空间来控制您的事务。然后事务将跨越连接。

    使用 System.Transactions 命名空间的一些基本代码:

    using (TransactionScope scope = new TransactionScope())
    {
         //Do operation 1 on connection 1 (open close connection)
         //Do operation 2 on connection 2 (open close connection)
    
         scope.Complete();
    }
    

    【讨论】:

    • 这是一个很好的答案,但我会添加一些内容。首先,当您使用 TransactionScope 时,您涉及到 MSDTC,因此如果它决定将事务升级为分布式事务,您需要确保已配置 MSDTC 并为其打开防火墙端口。其次,这更多地是对初始问题的参考,而不是您的答案,即当您在 C# 中打开/关闭连接时,通常不会将 1:1 映射到单独的 sql 连接/spid,因为驱动程序将池连接。
    • 关于 MSDTC 的观点非常好。 System.Transactions 非常易于使用,直到您的事务升级到 MSDTC。我们有两个数据库,一个 OLTP 和一个审计。对于审计,我使用 RequiresNew 来避免升级。我们并不真正关心审计是否失败(不是银行应用程序),因此这避免了 MSDTC 配置的升级和麻烦。
    • 哇,这比我想要的要好。优雅而直接。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 2014-11-13
    • 2011-11-22
    • 1970-01-01
    相关资源
    最近更新 更多