我正在開發一個基本上將數據從一組表中遷移到另一組的系統。一切工作正常,但我已決定採用交易,而不是在部分完成的事情上失敗。 (也就是說,如果發生某種異常,我想回滾而不是部分遷移數據。)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?)。
你看過發送到Sql Server的查詢嗎?我發現這篇文章很有用:http://www.sommarskog.se/query-plan-mysteries.html – 2011-05-25 17:57:01