与同一TransactionScope中的同一数据库的多个连接

时间:2019-11-08 16:22:29

标签: c# transactions

当我们为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();
    }
}

建议对每个语句使用连接“打开/关闭”。那是因为我们实际上不是在创建连接,而只是在池中使用一个。

为什么会这样?我得到的是,我们将连接保持了尽可能短的时间,但问题是,在大多数事务中,我们将在下一条语句的下一个时刻获取它。

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

在交易过程中保持一个连接打开是否有意义?

1 个答案:

答案 0 :(得分:1)

  

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

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

我认为“为每个语句使用一个”的动机是,不必担心创建SqlConnection对象时会变得高效。不要以全力以赴地保持生命,并在整个代码中传递它,以免避免断开网络连接。毫无意义。

在您的示例中,它并没有真正的改变。只要您要按顺序而不是并行进行查询,就可以对每个查询使用相同的SqlConnection对象。由于您节省了创建SqlConnection对象的计算时间,因此效率甚至可能更高。但是节省的时间甚至可能不会引起注意。