【问题标题】:What exactly is connection enlistment in C#C# 中的连接登记到底是什么
【发布时间】:2019-11-20 16:03:18
【问题描述】:

作为Multiple connections to the same DB in the same TransactionScope 的后续行动,我试图找出以下in this guide here 的确切含义:

连接从池中提取并根据事务分配 语境。除非在连接字符串中指定了 Enlist=false,否则 连接池确保连接在 当前上下文。当连接关闭并返回池时 使用登记的 System.Transactions 事务,它被搁置在 这样,该连接池的下一个请求与 相同的 System.Transactions 事务将返回相同的连接 如果有的话。

在另一节中提到

连接从池中提取并根据事务上下文进行分配。

当一个连接关闭时,它会被释放回池中,并根据其事务上下文释放到适当的细分中。

基于以上,我有两个问题:

  1. 是否可以安全地假设一个已登记的连接永远不会在另一个事务中使用,只要该事务存在,即使它已关闭?是否有任何文件解释我们的假设是否如此?
  2. 如果仅在登记事务中使用连接,它怎么会不可用?这可能是什么情况?

【问题讨论】:

    标签: c# transactions


    【解决方案1】:

    假设一个登记的连接永远不会被使用是否安全 只要交易存在,在另一个交易中,即使 关门了吗?

    是的。

    是否有任何文件解释我们的假设是否如此?

    您引用它:“连接是从池中提取并根据事务上下文分配的。”

    如果仅在登记事务中使用连接,它怎么可能不可用?这可能是什么情况?

    它可以在使用中。例如在 TransactionScope 中:

    using (var con = new SqlConnection(...))
    {
       con.Open();
       using (var con2 = new SqlConnection(...))  
       {
         con2.Open(); //con is not available, as it's open and in-use so a new connection will be opened and enlisted
       }
    }
    

    【讨论】:

    • 我也是这么想的。我想知道如果两个连接在您的示例中引用相同的连接字符串会发生什么。
    • 它们是否使用相同的连接字符串没有区别,因为没有可用的池连接。如果他们使用不同的连接字符串,那么您将始终获得两个不同的连接,即使第一个连接可用。
    猜你喜欢
    • 1970-01-01
    • 2014-07-06
    • 1970-01-01
    • 2022-12-10
    • 2020-11-10
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多