Ошибка транзакции EntLib 5 - PullRequest
0 голосов
/ 21 декабря 2011

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

1 Ответ

0 голосов
/ 21 декабря 2011

Проблема заключается в том, что вы запускаете транзакцию, выполняете вставку, а затем пытаетесь выполнить выбор с использованием другого соединения.

Поскольку это другое соединение, селектор не участвует в исходной транзакции. Это вызывает блокировку выбора из-за невыполненной транзакции.

Способ обойти это - включить ваш выбор в вашу транзакцию. Просто пропустите транзакцию:

 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 и использование TransactionScope . Если бы вы использовали такой подход, вам не пришлось бы передавать транзакции своим методам.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...