2011-12-21 3 views
0

Я использую блок доступа к данным Enterprise Library с транзакциями, но когда я вызываю другой метод (команда выбора) в блоках кода транзакции, я получаю ошибку тайм-аута, потому что транзакция блокирует 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. Если бы вы пошли с таким подходом, вам не пришлось бы передавать транзакции к вашим методам.

Или вы можете совершить транзакцию, а затем выполнить выбор, если это соответствует вашим требованиям.

Смежные вопросы