事务范围导致底层连接未能打开



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

底层连接无法打开。

内部异常是关于DTC的。我在网上读到,我必须在服务器上启用一些服务。但我不想那么做。如何在不启用DTC的情况下使用事务?我的代码是这样的

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

你的tx处理有一个严重的问题,它将把所有的负载推到不同的级别。

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

原因:

    如果一个Tx有一个连接,它在内核中作为本地事务范围处理。
  • 如果你有多个连接(事务资源),你需要DTC。

:

  • DTC比一个连接慢得多,服务器上的负载要大得多(多个打开的连接——它们必须保持打开状态,直到事务提交)。这也变成了一个多步骤的提交——通常有很多开销,使事情变慢。

这通常是一个"嘿,我只是使用事务"的反模式。

你应该确保你只创建一个数据库连接,除非你需要不止一个(比如涉及多个数据库),这样事务范围就不会传播到拥有多个资源的DTC。

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

相关内容

  • 没有找到相关文章

最新更新