0

我正在开发一个系统,该系统基本上将数据从一组表迁移到另一组表。一切正常,但我决定使用事务而不是仅仅在部分完成的事情上失败。(也就是说,如果发生一些异常,我想回滚而不是迁移部分数据。)

我有一个服务(以 3 层架构方式,而不是 Web),它在数据访问层上开始事务。数据上下文在包含许多方法的数据访问类中共享。这些方法使用各种 LINQ-to-SQL 技术来更新/插入/删除。所有 LINQ-to-SQL “选择”都在 CompiledQueries 中。

“BeginTransaction”方法像这样启动一个事务:

Public Sub BeginTransaction() Implements ITransactionalQueriesBase.BeginTransaction
    Me.Context.Connection.Open()
    Me.Context.Transaction = Context.Connection.BeginTransaction()
    IsInTransaction = True
End Sub

基本上,我编写了一个测试,它启动一个事务,插入一个表,然后尝试检索刚刚插入的值,所有这些都在事务期间进行。我这样做是因为我想断言 insert 方法实际上试图插入。然后,在测试期间我会回滚,然后测试以确保新插入的值实际上并未提交到表中。测试看起来像这样:

<TestMethod()>
    Public Sub FacilityService_Can_Rollback_A_Transaction()
        faciService.BeginTransaction()

        Dim devApp = UnitTestHelper.CreateDevelopmentApplication(devService.GetDevelopmentType("NEWFACI").ID, 1, 1, 1, 1)

        Dim devInsertRes = devService.InsertDevelopmentApplication(devApp)

        Assert.IsTrue(devInsertRes.ReturnValue > 0)

        For Each dir1 In devInsertRes.Messages
            Assert.Fail(dir1)
        Next

        Dim migrationResult = faciService.ProcessNewFacilityDevelopment(devInsertRes.ReturnValue)
        Assert.IsTrue(migrationResult.ReturnValue.InsertResult)

        Dim faciRetrieval1 = faciService.GetFacilityByID(migrationResult.ReturnValue.FacilityID)
        Assert.IsNotNull(faciRetrieval1.ReturnValue)

        faciService.Rollback()

        Dim faciRetrieval2 = faciService.GetFacilityByID(migrationResult.ReturnValue.FacilityID)
        Assert.IsNull(faciRetrieval2.ReturnValue)
    End Sub

所以,对于我的问题...

当测试到达“faciRetrieval1”步骤时,它会在那里停留大约 30-60 秒,然后再继续。我不确定为什么会这样。如果我在 SSMS 中的事务中运行相同的查询,它会立即发生。有没有人有任何想法?该数据库是 SQL Server 2008 SP1 (R2?)。

4

1 回答 1

0

我发现如果您有一个使用事务的数据上下文,那么任何其他数据上下文似乎都无法从另一个相同类型的上下文中进行选择。

我最终通过在事务发生时在每次选择/更新/删除中使用相同的上下文来修复它。

于 2011-06-17T20:52:51.067 回答