2011-12-21 2 views
0

트랜잭션과 함께 엔터프라이즈 라이브러리 데이터 액세스 차단을 사용하고 있지만 트랜잭션 코드 블록에서 다른 방법 (select 명령)을 호출 할 때 트랜잭션 잠금으로 인해 시간 초과 오류가 발생합니다.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을 사용하는 것입니다. 이 접근법을 사용했다면 트랜잭션을 메소드에 전달할 필요가 없습니다.

또는 트랜잭션을 커밋 한 다음 요구 사항에 맞는 경우 선택을 수행 할 수 있습니다.