фон
У меня есть код, который открывает соединение sql, начинает транзакцию и выполняет некоторые операции над БД. Этот код создает объект из БД (dequeue), получает некоторые значения и сохраняет их обратно. Вся операция должна выполняться в транзакции. Весь код отлично работает без транзакции.
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
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;
    }
}
Получить код пути
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 "";
    }
}
Сохранить код
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();
    }
}
Проблема
Когда вызывается transaction.Commit(), я получаю следующую ошибку:
Операция транзакции не может быть выполнена из-за ожидающих запросов на эту транзакцию.
Что я делаю неправильно?
EDIT: Быстрое редактирование, чтобы сказать, что я прочитал другие вопросы об этой проблеме на SO, но не смог найти связанных с ADO.net