使用TransactionScope的事务不会在多线程执行路径中回滚

时间:2013-05-20 16:13:35

标签: entity-framework transactions entity-framework-5 sql-server-express transactionscope

我有以下代码:

Public Async Function Convert(schemaProgress As IProgress(Of ProgressReport), membersProgress As IProgress(Of Boolean), indexProgress As IProgress(Of Boolean)) As Task
   Try
        Using scope As New TransactionScope

            Await ConvertRootAsync()

            Dim schemaConversion = ConvertSchemaAsync(schemaProgress)

            Await ConvertMembersAsync(membersProgress)
            Await ConvertIndexAsync(indexProgress)
            Await schemaConversion

            scope.Complete()
        End Using
    Catch ex As Exception
        Logger.ErrorException("", ex)
        Throw New FatalConversionException
    End Try
End Function

各种“转换”方法使用DbContext的{​​{1}}方法将数据添加到数据库中。

为了测试这个,我在ConvertMembersAsync方法中产生了一个故意的错误。 SaveChanges块中的代码可以正常处理。但是,在异常之前执行的SaveChanges操作不会回滚。

底层提供者是SQLExpress LocalDb的提供者。 连接字符串:

“Data Source =(LocalDb)\ v11.0; Initial Catalog = OurDb; MultipleActiveResultSets = True; Integrated Security = True; AttachDBFilename = | DataDirectory | MyDb.mdf”

我做错了什么?

1 个答案:

答案 0 :(得分:0)

您需要将DependentTransaction传递给Async方法。 Async方法需要在新DependentTransaction的构造函数中插入此TransactionScopeIt is documented on MSDN