私は基本的に、あるテーブルのセットから別のセットにデータを移行するシステムの一部を開発しています。すべてが正常に機能しますが、部分的に完了したものに失敗するのではなく、トランザクションを採用することにしました。(つまり、何らかの例外が発生した場合、部分的なデータを移行するのではなく、ロールバックしたいと思います。)
データアクセス層でトランザクションを開始するサービス(Webではなく3層アーキテクチャの方法)があります。データコンテキストは、多くのメソッドを含むデータアクセスクラスで共有されます。これらのメソッドは、さまざまなLINQ-to-SQL手法を使用して、更新/挿入/削除します。LINQから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内のトランザクションで同じクエリを実行すると、すぐに発生します。誰かアイデアはありますか?データベースはSQLServer2008 SP1(R2?)です。