【问题标题】:Multiple connections to the same DB in the same TransactionScope多个连接到同一 TransactionScope 中的同一 DB
【发布时间】:2019-11-08 16:22:29
【问题描述】:

当我们在 C# 中为每个语句打开关闭连接时,如何在单个事务中处理连接?

场景是使用相同的连接字符串,连接打开和关闭多种类型,每个语句一次。

考虑以下示例

void updateSomething() {
    using (SqlConnection connection = new SqlConnection(  
      "Integrated Security=SSPI;Initial Catalog=Northwind"))  
    {  
        connection.Open();        
        // Execute the statements
        connection.Close();  
    }  
 }

当我执行以下代码时:

void SomeMethod()
{
    using(TransactionScope scope = new TransactionScope())
    {
        for(int i=0; i < 10; i++) 
        {
            this.updateSomething();
        }
        scope.Complete();
    }
}

建议对每个语句使用连接打开/关闭。那是因为我们实际上并没有创建连接,我们只是使用池中的一个。

为什么会这样?我知道我们保持连接的时间越短越好,但问题是在大多数交易中,我们将在下一个语句的下一刻得到它。

是否只是为了避免在语句之间存在要求的代码计算时间(如果存在)(它不应该这样做,因为它会将数据库锁定在事务状态所需的时间更长)。

在事务期间保持一个连接打开是否有意义?

【问题讨论】:

  • “建议对每个语句使用打开/关闭连接” - 你从哪里读到的? (我没有怀疑,我只是好奇)
  • 剧透:一个连接实际上在事务期间保持打开状态,因为事务实际上不能跨越连接(除非您涉及分布式事务协调器)。 SqlConnection 会透明地为您处理这件事,如果您重用完全相同的连接字符串,它会识别这种情况。对您的好处与在运行中打开连接时始终获得的好处相同:编写内部代码更容易,而无需了解事务或如何从错误中恢复。
  • 不正确。在事务支持下检查docs.microsoft.com/en-us/dotnet/framework/data/adonet/…。我的问题是 enlist 操作是否太耗时。

标签: c# transactions


【解决方案1】:

建议对每个语句使用连接打开/关闭。

没有在上下文中看到该评论,我猜此建议是因为您所说的:创建和销毁 SqlConnection 对象并不意味着您正在创建和销毁网络连接。

我认为“对每个语句使用一个”背后的动机是不要担心在创建 SqlConnection 对象时试图提高效率。不要竭尽全力让一个人活着,并在整个代码中传递它,以为你正在避免破坏网络连接。没有意义。

在您的示例中,它不会真正产生影响。如果您愿意,可以对每个查询使用相同的 SqlConnection 对象,只要您按顺序而不是并行进行。由于您节省了创建 SqlConnection 对象的计算时间,因此它甚至可能稍微更有效率。但节省的时间可能甚至不会被注意到。

【讨论】:

  • 这是真的吗。在文档中,提到在事务中,如果与事务相关的连接不可用,则另一个连接将加入它。我说的是多语句事务,而不是原子语句。入伍不收费吗?
  • 对。我也在谈论多语句交易。您可以 1. 为每个语句创建一个新的 SqlConnection,并在开始下一个语句之前为每个语句创建一个 Close,或者 2. 为每个语句使用相同的 SqlConnection。两种方式都将使用相同的网络连接。
  • 使用第二个实际网络连接(以及切换到分布式事务)的唯一原因是,如果您创建了一个新的 SqlConnection 对象而不释放前一个对象。这显示在the example in the documentation for TransactionScope
  • 我说的是不可用的 sql 连接。检查我在问题下的最后评论。
  • 您链接到的那个文档说它会在事务开始时保持连接打开并使用它,除非它不可用。它不可用的唯一原因是,如果您创建第二个 SqlConnection 对象而不处置第一个对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
  • 2018-07-06
  • 2012-04-12
相关资源
最近更新 更多