2016-07-04 3 views
-1

現在、TranactionScopeとローカルファイルデータベース(mdf)を使用して、いくつかのエンドツーエンドテスト(E2E)を実装しようとしています。面白いのは、クエリがロールバックされていないため、すべての更新/挿入が保持されているということです。私が間違って行われているものを理解しないローカルデータベースのトランザクションスコープ

 using (new TransactionScope()) 
     { 
      var newItem1 = new SomeEntity { Id = 4, Remark = "Test 2" }; 
      var newItem2 = new SomeEntity { Id = 5, Remark = "Test 2" }; 

      var x = new List<SomeEntity> { newItem1, newItem2 }; 
      _testTvp.SaveSomeEntities(x); 

      var result = _test.GetSomeEntity(4); 
      Assert.AreEqual(newItem1.Remark, result.Remark); 
      result = _test.GetSomeEntity(5); 
      Assert.AreEqual(newItem2.Remark, result.Remark); 
     } 

私の接続文字列は次のとおりです。

より多くのコードのために、ここを参照してください:enter link description here

+1

「SaveSomeEntities」とは何ですか? –

答えて

0

何が間違っていません。これはTransactionScopeの仕組みです。 MSDN

から

例外がトランザクション・スコープ内で発生しない場合(つまり、のTransactionScopeオブジェクトと そのDisposeメソッドの呼び出しの 間の初期化である)、トランザクションにスコープ 参加は進めることが許されます。トランザクション範囲が 内で例外が発生した場合、トランザクションスコープに参加するトランザクションは にロールバックされます。 :

それはあなたが周囲のトランザクションを持っているかもしれない例外が

+0

しかし、完全なトランザクションはコミットされません...私はちょうど完了を実行しない場合、ロールバックは決して失敗しませんでした。私は例外をスローしようとしましたが、トランザクションには何の影響もないようです。 –

+0

@RomanKernそれから '_testTvp.SaveSomeEntities(x);はトランザクションをコミットしています – giammin

+0

_testTvpはタイプ:ExecutionTest:IRepositoryです。 ExecutionTestは実装されていないインタフェースです。私はプロキシを使ってこのメソッドの実行ステークを生成しています。インターセプタクラス名はGenericDalInterceptorです。コミットするトランザクションはありません。 この動作は本当に奇妙です。たぶんそれはデータベースエンジンに依存します。このテストでは、ローカルDbを使用します。私は実際のサーバーにデータベースを移動し、何が起こったか再度試すことができます。 –

0

を発生した場合にのみ、あなたが

using (SqlConnection sqlConnection = new SqlConnection(connectionString)) 
       { 
        sqlConnection.Open(); 
        using (SqlTransaction sqlTrans = sqlConnection.BeginTransaction()) 
        { 
         //put your code here 
        } 
       } 
+0

トランザクションをbinにする必要があります特定のDbCommand。これはコードをより複雑にします。新しいトランザクションを作成せずにConnectionからトランザクションにアクセスできる場合は、問題ありません。 プロジェクト内のIRepositoryのExecution Stackについて調べることができます。なぜなら、BeginTransactionがまったくないのはなぜでしょうか。 –

0

使用でこれをしようとしないのはなぜあなたのスタックに応じて、のようなものを、トランザクションをロールバックし

string connStr = "...; Enlist = false"; 
using (TransactionScope ts = new TransactionScope()) 
{ 
    using (SqlConnection conn1 = new SqlConnection(connStr)) 
    { 
     conn1.Open(); 
     conn1.EnlistTransaction(Transaction.Current); 
    } 
} 

Under what circumstances is an SqlConnection automatically enlisted in an ambient TransactionScope Transaction?

+0

私はIDbConnectionを使用しています。複数のデータベースに対して最大限の柔軟性を保証します。 EnlistTransaction明示的にSqlDbConnectionで定義されています。だから使えない。 IDbConnectionをSqlDbConnectionに変換するとEnlistTransactionが動作します。接続文字列enlist = false/trueはトランザクションスコープには影響しません –

+0

接続がどのように定義されているかわかりませんでした。 Completeメソッドを呼び出さないと、なぜトランザクションが永続化されているのかわからないのですか? – Marco

+0

データを永続化したくありません。テストでは、コミットされていない状態で一時的にデータを追加するだけです。もちろん、テーブルからデータを削除することはできますが、ロールバックが私の最初の選択です –

0

はこれを試してみてください:

using (new scope = new TransactionScope()) 
    { 
     var newItem1 = new SomeEntity { Id = 4, Remark = "Test 2" }; 
     var newItem2 = new SomeEntity { Id = 5, Remark = "Test 2" }; 

     var x = new List<SomeEntity> { newItem1, newItem2 }; 
     _testTvp.SaveSomeEntities(x); 

     var result = _test.GetSomeEntity(4); 
     Assert.AreEqual(newItem1.Remark, result.Remark); 
     result = _test.GetSomeEntity(5); 
     Assert.AreEqual(newItem2.Remark, result.Remark); 

     //either of the two following: 
     Transaction.Current.Rollback(); 
     scope.Dispose(); 

    } 
+0

試してみました。 –

0

まあ、私は正確に間違っているかを把握couldntの。これに対する解決策は、挿入されたデータを削除することです。最良の方法ではなく、DbTransaction.Iを使用している方が、実際のSQL Serverでいくつかのテストを作成し、違いが何であるかを確認します。

関連する問題