1

背景

我有一个 MVC 应用程序和一个 Windows 服务,它们访问使用 EntityFramework 的相同数据访问库。Windows 服务监视几个表上的某些活动并执行一些计算。

我们正在对数百个数据库使用 DAL 项目,在运行时为上下文生成连接字符串。

我们有许多函数(存储过程和调用 EF 实体的 .NET 方法),由于我们使用的数据范围非常大,因此可能会相互阻塞。

问题

Windows 服务不是那么重要,它不能等待。如果必须阻止某些东西,Windows 服务可以。早些时候,我发现了一些 SO 问题,这些问题表明这System.Transactions是将事务隔离级别设置为 READ UNCOMMITTED 以最小化锁的方法。

我试过这个,我可能会误解发生了什么,所以我需要澄清一下。

windows服务中的方法结构如下:

private bool _stopMe = false;

public void Update()
{
    EntContext context = new EntContext();
    do
    {
        var transactionOptions = new System.Transactions.TransactionOptions();
        transactionOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted;
        using (var transactionScope = new System.Transactions.TransactionScope( System.Transactions.TransactionScopeOption.Required, transactionOptions))
        {
            List<Ent1> myEnts = (from e....Complicated query here).ToList();
            SomeCalculations(myEnts);
            List<Ent2> myOtherEnts = (from e... Complicated query using entities from previous query here).ToList();
            MakeSomeChanges(myOtherEnts);
            context.SaveChanges();
        }
        Thread.Sleep(5000);  //wait 5 seconds before allow do block to continue
    }while (! _stopMe)
}

当我执行第二个查询时,会引发异常:

The underlying provider failed on Open.
    Network access for Distributed Transaction Manager (MSDTC) has been disabled. Please
    enable DTC for network access in the security configuration for MSDTC using the
    Component Services Administrative tool.
        The transaction manager has disabled its support for remote/network
        transactions. (Exception from HRESULT: 0x8004D024)

我可以假设我不应该在那个 using 块中调用多个查询?第一个查询返回得很好。这是一次在一个数据库上执行的(实际上其他实例正在不同的线程中运行,并且该线程中的任何内容都不会触及其他实例)。

我的问题是,这是应该如何使用它还是我应该知道的更多?

注意:这是一个监控功能,所以必须反复运行。

4

1 回答 1

1

在您的代码中,您使用的是事务范围。看起来第一个查询使用了轻量级数据库事务。当第二个查询到来时,事务范围将事务升级为分布式事务。

分布式事务使用 MSDTC。

这是错误出现的地方,默认情况下未启用 MSDTC。即使启用并启动它,也需要将其配置为允许远程客户端创建分布式事务。

于 2012-09-12T18:25:33.593 回答