.net - TransactionScope一直在努力提升到MSDTC

标签 .net entity-framework transactions transactionscope

我正在尝试在循环内使用事务范围。整个循环使用与数据库的单个连接进行。我正在使用 Entity Framework 4 进行数据库访问。在循环的第二次迭代期间,当执行 LINQ to Entites 查询时,会引发异常,指出服务器上的 MSDTC 不可用。

我读到显式打开连接然后登记事务应该可以解决这个问题,但事实并非如此。下面是反射(reflect)正在发生的基本操作的示例代码。

关于如何防止升级到 MSDTC 有什么想法吗?

Using context = New MyEntities()
    Dim connection = context.Connection

    connection.Open()

    For index = 0 to (Me.files.Count - 1)
        Dim query = From d In context.Documents
                    Where (d.DocumentID = documentID)
                    Select d.Status

        Dim status = query.FirstOrDefault()

        Using trans = New TransactionScope()
            connection.EnlistTransaction(Transaction.Current)

            Dim result = context.UpdateStatus(True)

            If (result = 1) Then
                WriteToFile()
                trans.Complete()
            End If
        End Using
    Next
End Using

编辑:如果我使用connection.BeginTransaction()、transaction.Commit()和transaction.Rollback()而不是TransactionScope,它工作得很好。不过,我仍然想找到一种方法让 TransactionScope 发挥作用。

最佳答案

TransactionScope 最初存在一个问题,即当遇到另一个连接时,它会将事务提升为分布式事务,即使所有连接都连接到同一个数据库。这是框架中的一个已知问题。

我相信他们在 .NET 4 中解决了这个问题,您使用的是哪个版本?

此答案中提供了解决方法:

Why is TransactionScope using a distributed transaction when I am only using LinqToSql and Ado.Net

与您的问题的评论基本相同,建议实际上只使用池中的一个物理连接 - 因此只有一个连接被登记。

再次查看您的问题,我可以看到上述内容不太可能产生不同,因为无论如何您只使用一个连接。也许尝试在每次迭代时显式关闭并重新打开连接,并利用连接池的好处。

或更理想的情况是,放弃使用 TransactionScope,因为 IDbTransaction 这里有足够的范围来覆盖您的代码。

关于.net - TransactionScope一直在努力提升到MSDTC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5899430/

相关文章:

c# - 使用 Entity Framework LINQ 有效检查数据库中是否存在记录

mysql - 为什么在未发出提交时插入记录?

java - Spring 事务管理 : Cannot resolve reference to bean 'transactionManager'

c# - Ninject Factory 扩展将多个具体类型绑定(bind)到一个接口(interface)

c# - 从字符串列名称动态创建 LINQ Select 表达式

c# - 不支持直接绑定(bind)到存储查询(DbSet、DbQuery、DbSqlQuery、DbRawSqlQuery)的数据。加载不存在

php - 根据 CSV 每 x 分钟用 PHP 更新整个表

.net - 使用 mdbg 连接到 w3wp

Java NIO 与 DotNet IO 性能对比

c# - 创建 WCF 服务时要避免哪些 DataContract 对象类型?