给出基础连接的交易范围未能打开

时间:2014-03-18 08:53:55

标签: c# linq linq-to-entities

对于LINQ,我使用TransactionScope来处理事务。当我执行查询时,我得到一个例外。

  

底层连接无法打开。

并且内部例外是关于DTC的。我在网上看到,我必须在服务器上启用一些服务。但我不想这样做。如何在不启用DTC的情况下使用transcactions。我的代码是这样的

public void function1()
{
     using(TransactionScope t = new TransactionScope())
     {
         RunSomeSelectQueries();
         RunSomeInsertQueries();
         RunSomeUpdate Queries();

         t.Complete();
     }
}

提前致谢。

1 个答案:

答案 0 :(得分:1)

你的tx处理存在一个严重的问题,它将把不同的负载推到不同的水平。

  • TransactioNScope很不错,但
  • 调用打开单独连接而不需要的方法是不好的。

原因如下:

  • 如果Tx有一个连接,则在内核中将其作为本地transaciton范围处理。
  • 如果您有多个连接(交易资源),则需要DTC。

  • DTC比连接慢得多,服务器上的负载更多(多个打开的连接 - 它们必须保持打开直到事务提交)。这也变成了一个多步提交 - 通常会产生大量开销并使速度变慢。

这通常是一个"嘿,我只是使用交易"反模式。

正确地说,您应该确保只创建一个数据库连接,除非您需要多个数据库连接(例如涉及多个数据库),以便事务范围不会因为有多个资源而转移到DTC。

显然,如果需要,你也应该正确配置DTC,但是再次:在这种情况下,真正的问题是你滥用事务范围强制DTC传播,而实际上并不需要。