首次打开的EF4、.Net 4.5、SQL Server 2012上的MSDTC升级

本文关键字:Server SQL 2012 上的 升级 MSDTC Net EF4 | 更新日期: 2023-09-27 18:22:13

我有以下代码:

var scopeOption = TransactionScopeOption.RequiresNew;
var transactionOptions = new TransactionOptions
{
    IsolationLevel = IsolationLevel.ReadUncommitted
};
using (new TransactionScope(scopeOption, transactionOptions))
{
    var context = new ObjectContext("connection string");
    context.Connection.Open(); // <-- This line throws
}

它抛出以下异常:

System.Data.EntityException: The underlying provider failed on Open.
Caused by: System.Data.SqlClient.SqlException, MSDTC on server 'xxxx' is unavailable.

但它只在第一次尝试打开连接时抛出异常。对示例代码的任何后续调用都能正常工作,不要试图联系DTC。

注意:scopeOption更改为TransactionScopeOption.Suppress似乎可以解决此问题,而且由于我没有对数据库执行任何写入操作,因此完全可以接受。

有人能想到为什么在全新的TransactionScope中打开第一个(也是唯一一个)连接只会在第一次调用代码时导致DTC升级吗?

首次打开的EF4、.Net 4.5、SQL Server 2012上的MSDTC升级

如果有人遇到这个问题,我解决这个问题的唯一方法就是更改代码,以便在事务范围之外创建上下文。

var scopeOption ...
var transactionOptions ...
var context = new ObjectContext("connection string");
using (new TransactionScope(scopeOption, transactionOptions))
{
    context.OpenConnection();
    //do other stuff here with the context.
}