Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

The transaction operation cannot be performed because there are pending requests working

Tags:

background

I have some code which opens a sql connection, begins a transaction and performs some operations on the DB. This code creates an object from the DB (dequeue), gets some values and saves it back. The whole operation needs to take place in a transaction. All the code works perfectly without the transaction.

using (var connection = new SqlConnection(connectionString)) {     connection.Open();     var transaction = connection.BeginTransaction();     try     {                                var myObject = foo.Dequeue(connection, transaction);          var url = myObj.GetFilePathUri(connection, transaction);          //some other code that sets object values          myObj.SaveMessage(connection, transaction);         transaction.Commit(); //error here     }     catch(Exception ex)     {                             transaction.Rollback();         //logging                     }     finally     {         //cleanup code     } } 

dequeue method code

public foo Dequeue(SqlConnection connection, SqlTransaction transaction) {     using (var command = new SqlCommand(DEQUEUE_SPROC, connection) {CommandType = CommandType.StoredProcedure, Transaction = transaction})     {         var reader = command.ExecuteReader();         if (reader.HasRows)         {             reader.Read();             ID = (Guid) reader["ID"];             Name = reader["Name"].ToString();             return this;         }         return null;     } } 

Get Path Code

public string GetFilePathUri(SqlConnection connection, SqlTransaction transaction) {     using (var command = new SqlCommand(FILEPATH_SPROC, connection) {CommandType = CommandType.StoredProcedure, Transaction = transaction})     {         var reader = command.ExecuteReader();         if (reader.HasRows)         {             reader.Read();             return reader["Path"].ToString();         }         return "";     } } 

Save Code

public void SaveMessage(SqlConnection connection, SqlTransaction transaction) {     using (var command = new SqlCommand(SAVE_SPROC, connection) {CommandType = CommandType.StoredProcedure, Transaction = transaction})     {         command.Parameters.Add("@ID", SqlDbType.UniqueIdentifier).Value = ID;         command.Parameters.Add("@Name", SqlDbType.VarChar).Value = Name;         //other object params here         command.ExecuteNonQuery();     } } 

The problem

When transaction.Commit() is called, I get the following error:

The transaction operation cannot be performed because there are pending requests working on this transaction.

What am I doing wrong?

EDIT: Quick edit to say I have read the other questions about this problem on SO, but couldn't find any related to ADO.net

like image 799
Jay Avatar asked Apr 11 '16 14:04

Jay


1 Answers

I have had this issue before and the problem was the reader needed to be closed. Try this:

public foo Dequeue(SqlConnection connection, SqlTransaction transaction) {     using (var command = new SqlCommand(DEQUEUE_SPROC, connection) {CommandType = CommandType.StoredProcedure, Transaction = transaction})     {         var reader = command.ExecuteReader();         if (reader.HasRows)         {             reader.Read();             ID = (Guid) reader["ID"];             Name = reader["Name"].ToString();             reader.Close();//Closing the reader             return this;         }         return null;     } }   public string GetFilePathUri(SqlConnection connection, SqlTransaction    transaction) {     string filePathUri = "";     using (var command = new SqlCommand(FILEPATH_SPROC, connection) {CommandType = CommandType.StoredProcedure, Transaction = transaction})     {         var reader = command.ExecuteReader();         if (reader.HasRows)         {             reader.Read();             filePathUri = reader["Path"].ToString();         }         reader.Close();//Closing the reader     }     return filePathUri; } 
like image 101
Ernest Avatar answered Sep 18 '22 04:09

Ernest