【问题标题】:Error: The underlying provider failed on Open. How to resolve it?错误:基础提供程序在打开时失败。如何解决?
【发布时间】:2014-10-17 20:54:58
【问题描述】:

我有类似这样的代码的功能:

using(var db = new MyDbContext())
{
    //a whole bunch of code, db is working.

    //then I try opening another DbContext like so
    using(var dba = new AnotherDbContext())
    {
        //about 2 lines of code just to get something from a database
    }
}

然后当我到达第二个 DbContext 时收到 2 条错误消息:

“底层提供程序在打开时失败。” &“服务器 'myserver' 上的 MSDTC 不可用。”

有人知道发生这种情况的原因吗?我可以一次打开 2 个 DbContext 吗?

【问题讨论】:

  • 嗯,在一个方法中混合两个上下文/数据库/任何东西在一般编程中通常是一个非常糟糕的主意。为什么你需要这样做?到目前为止听起来像是一个糟糕的建筑设计......
  • 我使用一个数据库来存储我可以在所有项目中使用的 CanadaPost 信息。 @walther

标签: c# sql using


【解决方案1】:

在第一个场景中,您正在嵌套 AnotherDbContext。为它们中的每一个打开一个到数据库的连接。当您在 using 块中调用服务方法时,会在 MyDbContext 中打开一个新连接,而另一个已经打开。 这会导致您的事务被提升为分布式事务,并且部分提交的数据(服务中 dba.SaveChanges 调用的结果)无法从您的外部连接获得。另请注意,分布式事务是速度要慢得多,因此会带来性能下降的副作用。

private void btnTwoConnectionsNested_Click(object sender, EventArgs e)
{
    string connectionString = @"Data Source=" + tbServer.Text
        + @";Initial Catalog=master;Integrated Security=True; timeout=0";

    using (TransactionScope transactionScope = new TransactionScope())
    {
        SqlConnection connectionOne = new SqlConnection(connectionString);
        SqlConnection connectionTwo = new SqlConnection(connectionString);

        try
        {
            //2 connections, nested
            connectionOne.Open();
            connectionTwo.Open(); // escalates to DTC on 05 and 08
            connectionTwo.Close();
            connectionOne.Close();

            MessageBox.Show("Success");
        }
        catch (Exception ex)
        {
            MessageBox.Show("ERROR: " + ex.Message);
        }
        finally
        {
            connectionOne.Dispose();
            connectionTwo.Dispose();
        }
    }
}

在一个事务范围内,它将打开两个嵌套的连接。 结果:

针对 SQL Server 2005 实例: 服务器“SERVERNAME”上的 MSDTC 不可用。

针对 SQL Server 2008 实例:
服务器“SERVERNAME”上的 MSDTC 不可用。

SQL Server 确实并且应该升级到 DTC 以在两个版本中进行嵌套连接。

嵌套连接将在 SQL Server 2005 和 2008 中升级为 DTC。一次打开一个连接将在 2005 年升级为 DTC,但不会在 2008 年。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多