簡體   English   中英

錯誤:基礎提供程序在打開時失敗。 怎么解決呢?

[英]Error: The underlying provider failed on Open. How to resolve it?

我的功能類似於以下代碼:

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條錯誤消息:

“底層提供程序在Open上失敗。” &“服務器'myserver'上的MSDTC不可用。”

有人知道發生這種情況的原因嗎? 我可以一次打開2個DbContext嗎?

在第一種情況下,您將嵌套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年不會升級。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM