[英]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.