TransactionScope总是尝试升级到MSDTC

DCN*_*YAM 7 .net entity-framework transactions transactionscope

我试图在循环中使用事务范围.整个循环使用与数据库的单个连接进行.我正在使用实体框架4进行数据库访问.在循环的第二次迭代期间,当执行LINQ to Entites查询时,将抛出异常,指出服务器上的MSDTC不可用.

我已经读过明确打开连接,然后征集事务应该解决这个问题,但事实并非如此.下面是反映正在进行的基本操作的示例代码.

有关如何防止升级到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
Run Code Online (Sandbox Code Playgroud)

编辑:如果我使用connection.BeginTransaction(),transaction.Commit()和transaction.Rollback(),它可以正常工作,而不是TransactionScope.但是,我仍然想找到一种使TransactionScope工作的方法.

Ada*_*rth 1

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

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

这个答案中提供了一个解决方法:

当我只使用 LinqToSql 和 Ado.Net 时,为什么 TransactionScope 使用分布式事务

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

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

或者更理想的情况是,在此处放弃使用TransactionScopeasIDbTransaction有足够的范围来覆盖您的代码。