2011-05-25 47 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

我發現如果你有一個使用事務的數據上下文,任何其他數據上下文似乎都無法從另一個相同類型的上下文中進行選擇。

我最終通過在事務發生時每次選擇/更新/刪除時使用相同的上下文來修復它。