2011-05-25 61 views
0

我正在开发一个基本上将数据从一组表中迁移到另一组的系统。一切工作正常,但我已决定采用交易,而不是在部分完成的事情上失败。 (也就是说,如果发生某种异常,我想回滚而不是部分迁移数据。)Linq到SQL事务插入然后选择真的,真的很慢

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

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

,我已经写了测试,其启动事务时,插入到一个表,然后尝试检索刚插入的值:

的“的BeginTransaction”方法开始一个事务这样,全部在交易过程中。我这样做是因为我想断言插入方法实际上试图插入。然后,在测试过程中,我会回滚,然后进行测试,以确保新插入的值没有实际提交给表。测试看起来是这样的:

<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?)。

+0

你看过发送到Sql Server的查询吗?我发现这篇文章很有用:http://www.sommarskog.se/query-plan-mysteries.html – 2011-05-25 17:57:01

回答

0

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

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