【问题标题】:Transaction scope with pooling in Linq2Sql在 Linq2Sql 中使用池化的事务范围
【发布时间】:2011-11-10 15:33:59
【问题描述】:

如果我将连接字符串中的池设置为 true,则以下代码可以正常工作。如果关闭它会失败并显示:“MSDC 不可用”。

当池打开时,两个 DataContext 从池中选择相同的连接只是纯粹的运气,还是TransactionScope 完成了某种协调?

using(var scope = new TransactionScope())
{
    using(var db = new DataContext(connectionString))
    {
        //Do stuff
    }
    using(var db = new DataContext(connectionString))
    {
        //Do stuff
    }
    scope.Complete();
}

在我的真实代码中,我目前无法将特定连接传递给 DataContext,但使用了连接字符串。如果可能的话,我也想避免使用分布式事务协调器。

【问题讨论】:

  • 您使用相同类型和相同连接字符串的两个数据上下文的原因是什么?为什么不简单地使用一个 Datacontext?
  • @Pleun 业务逻辑层中的一个函数正在调用数据访问层中的多个函数,每个函数都有自己的数据上下文创建。
  • 所以第一个 //Do stuff 是 DataAccessLayer 函数,第二个 //Do stuff 是第二个函数?他们仍然可以使用相同的数据上下文,不是吗?
  • @Pleun 没错。如果他们要使用相同的上下文,则需要对其进行某种生命周期管理或同步,我不能只创建它并将其放入 DAL 类中的变量中,因为我无法确定多长时间和由什么当前访问的其他线程。
  • 嗯,生命周期管理和数据上下文不能一起使用。它应该是合乎逻辑的工作单元并且是短暂的。你在做winforms吗?

标签: c# sql-server-2005 linq-to-sql transactionscope


【解决方案1】:

您在这里很幸运,因为您的两个连接字符串都匹配,因此启用池时您将获得相同的池连接。但是,如果有多个并发访问使用此连接字符串的连接,则结果将不确定,因为您可能不会在第二个 DataContext 实例中获得相同的池连接。

如果您必须在同一个事务中创建两个 DataContext 对象,那么您将需要使用 DTC。如果您不能使用 DTC,那么您需要找到一种方法在事务中只使用一个 DataContext 对象。

【讨论】:

  • am 在我的示例中对 DataContext 使用相同的事务,并且只要池打开,它在没有 DTC 的情况下工作正常。但是我如何确定从池中选择了相同的连接?池中不是有很多连接(使用相同的连接字符串)还是只有一个?
  • 池中可能会有许多具有相同连接字符串的连接。如果此事务中可能有多个并发调用,则无法确保从池中选择相同的连接。
  • 现在,通过将“Max Pool Size=1”添加到连接字符串中,将连接池的大小限制为 1,可以确保每次获得相同的连接。但是,这不会很好地扩展,我不建议这样做。
  • 感谢您的回答。你会如何建议解决这样的问题?在同一个连接中显式发送到 DataContext 的 ?
  • 我会这样做,或者你也可以尝试重构,以便只创建一个 DataContext 对象,然后根据需要传递它。
猜你喜欢
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
  • 2013-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-22
  • 1970-01-01
相关资源
最近更新 更多