InvalidOperationException при выполнении SqlCommand с транзакцией - PullRequest
2 голосов
/ 14 января 2009

У меня есть этот код, работающий параллельно в двух отдельных потоках. Несколько раз он работает нормально, но в некоторый случайный момент выдает InvalidOperationException:

Транзакция либо не связана с текущим соединением, либо была завершена.

В случае исключения я просматриваю транзакцию с Visual Studio и проверяю, нормально ли установлено ее соединение. Также command.Transaction._internalTransaction. _transactionState имеет значение Active, а свойство IsZombied имеет значение false.

Это тестовое приложение, и я использую Thread.Sleep для создания более длинных транзакций и создания наложений.

Почему может быть выдано исключение и что я могу с этим сделать?

IDbCommand command = new SqlCommand("Select * From INFO");
IDbConnection connection = new SqlConnection(connectionString);
command.Connection = connection;
IDbTransaction transaction = null;
try
{
    connection.Open();
    transaction = connection.BeginTransaction();
    command.Transaction = transaction;
    command.ExecuteNonQuery(); // Sometimes throws exception
    Thread.Sleep(forawhile); // For overlapping transactions running in parallel
    transaction.Commit();
}
catch (ApplicationException exception)
{
    if (transaction != null)
    {
        transaction.Rollback();
    }
}
finally
{
    connection.Close();
}

1 Ответ

2 голосов
/ 14 января 2009

Нашел решение. Оказывается, называя это

command.Connection = connection;

не означает, что вы установили соединение с командой. Сразу после этого я проверил результаты

command.Connection.GetHashCode();
command.GetHashCode();

и они не были равны. Рефакторинг кода для использования соединения

...