2011-12-21 8 views
0

私はエンタープライズライブラリデータアクセスブロックをトランザクションで使用していますが、トランザクションコードブロックで他のメソッド(selectコマンド)を呼び出すと、トランザクションがdbをロックするためタイムアウトエラーが発生します。EntLib 5トランザクションエラー

トランザクションでselectコマンドを呼び出すにはどうすればよいですか?

マイコード:

dbConn.Open(); 
using (dbConn) 
{ 
    using (dbTrans = dbConn.BeginTransaction()) 
    { 
     try 
     { 
      var cmd = dbClass.GetStoredProcCommand("Test_Insert"); 
      dbClass.AddInParameter(cmd, "@No", DbType.String, "Test"); 
      dbClass.AddOutParameter(cmd, "@ReturnValue", DbType.Int32, 4); 
      retval = dbClass.ExecuteNonQuery(cmd, dbTrans); 
      if (retval > 0) 
       retval = Convert.ToInt32(dbClass.GetParameterValue(cmd, @ReturnValue")); 
       var dsDetail=GetDetail(retval); **<-- Error Line i waiting long times and get timeout error** 
      dbTrans.Commit(); 
     } 

    } 

} 

private DataSetGetDetail (int TestID) 
{ 
    var TestSql = "Select * from 
    TestTable Where ID="+TestID; 
    var cmdTest = dbClass.GetSqlStringCommand(TestSql); 
    var dsTest= dbClass.ExecuteDataSet(cmd); 
    return dsTest;  
} 

答えて

0

問題は、トランザクションを開始挿入を行い、その後、異なる接続を使用して選択を実行しようとしているということです。

セレクトは元の取引に参加していないため、別の接続です。これにより、未処理のトランザクションによって選択がブロックされています。

これを回避する方法は、選択した商品を取引に含めることです。

private DataSetGetDetail (int TestID, DbTransaction dbTrans) 
{ 
    var TestSql = "Select * from 
    TestTable Where ID="+TestID; 
    var cmdTest = dbClass.GetSqlStringCommand(TestSql); 
    var dsTest= dbClass.ExecuteDataSet(cmd, dbTrans); 
    return dsTest;  
} 

代替方法としてSystem.Transactions and use a TransactionScopeを使用することができます。あなたがそのアプローチを行った場合、あなたのメソッドにトランザクションを渡す必要はありません。

または、トランザクションをコミットして、その要件に合った選択を実行することができます。

関連する問題