【问题标题】:Understanding TransactionScope and SQL Connection了解 TransactionScope 和 SQL 连接
【发布时间】:2019-05-26 21:34:28
【问题描述】:

在 .NET 中,当我们使用 TransactionScope 时,我们可以在多个连接之间共享同一个事务。

using(TransactionScope tran = new TransactionScope()) { 
  //this method open a new connection
  CallAMethodThatDoesSomeWork(); 
  //this method open another new connection
  CallAMethodThatDoesSomeMoreWork(); 
  tran.Complete(); 
}

考虑到事务需要特定连接才能在数据库中运行,我无法理解这怎么可能。

它是如何工作的?我认为也许物理连接总是相同的。这可能吗?

更新:假设所有连接的连接字符串都是相同的,即我不使用不同的数据库,总是相同的......

【问题讨论】:

  • 我忘了提到我正在使用相同的连接(相同的数据库,相同的连接字符串)。
  • 没关系。我不假装理解它,但 DTC 负责登记交易和处理投票,还有更多的魔法。如果您熟悉 Windows Communication Foundation,您甚至可以在事务中加入服务调用层! DTC 并非特定于 SQL Server。
  • 您阅读以下内容了吗? docs.microsoft.com/en-us/dotnet/framework/data/transactions 这是一个很好的起点。
  • @Crowcoder 为了完整性 - “轻量级事务管理器” (LTM) 可能能够处理其中的一些问题,而不是涉及 DTC,特别是如果所有内容都转到同一台服务器(相同的连接字符串和域帐户)。这也可能取决于它们是顺序的还是并发的。

标签: c# .net ado.net connection transactionscope


【解决方案1】:

感谢 cmets 我能够找到答案 here

当我们使用TransactionScope时我们可以跨多个连接共享同一个事务,因为这个事务被转换为分布式事务;分布式事务协调器 (DTC) 发挥了作用。

一般来说,即使连接到同一个数据库,TransactionScope 也会升级到 DTC。

规则的例外可能是当我们打开和关闭到同一个数据库的不同连接时不是同时;但并非所有数据库引擎都支持。

【讨论】:

    猜你喜欢
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 2014-06-23
    相关资源
    最近更新 更多