У меня есть этот код, работающий параллельно в двух отдельных потоках. Несколько раз он работает нормально, но в некоторый случайный момент выдает 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();
}