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工作的方法.
TransactionScope
最初存在一个问题,即当遇到另一个连接时,它会将事务提升为分布式事务,即使所有连接都连接到同一个数据库。这是框架中的一个已知问题。
我相信他们在 .NET 4 中解决了这个问题,您使用的是哪个版本?
这个答案中提供了一个解决方法:
当我只使用 LinqToSql 和 Ado.Net 时,为什么 TransactionScope 使用分布式事务
基本上与您的问题的评论相同,建议实际上只使用池中的一个物理连接 - 因此只有一个连接被登记。
再次查看您的问题,我可以看到上述内容不太可能有所不同,因为无论如何您只使用一个连接。也许尝试在每次迭代时显式关闭并重新打开连接,并利用连接池的好处。
或者更理想的情况是,在此处放弃使用TransactionScope
asIDbTransaction
有足够的范围来覆盖您的代码。
归档时间: |
|
查看次数: |
3065 次 |
最近记录: |