对于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传播,而实际上不需要。