TransactionScope concluído prematuramente
Eu tenho um bloco de código que é executado dentro de um TransactionScope e dentro desse bloco de código eu faço várias chamadas para o banco de dados. Seleciona, atualiza, cria e exclui toda a gama. Quando executo minha exclusão, eu a executo usando um método de extensão do SqlCommand que reenviará automaticamente a consulta se houver um conflito, pois essa consulta pode potencialmente atingir um conflito.
Acredito que o problema ocorre quando um impasse é atingido e a função tenta reenviar a consulta. Este é o erro que recebo:
A transação associada à conexão atual foi concluída, mas não foi descartada. A transação deve ser descartada antes que a conexão possa ser usada para executar instruções SQL.
Este é o código simples que executa a consulta (todo o código abaixo é executado no uso do TransactionScope):
using (sqlCommand.Connection = new SqlConnection(ConnectionStrings.App))
{
sqlCommand.Connection.Open();
sqlCommand.ExecuteNonQueryWithDeadlockHandling();
}
Aqui está o método de extensão que reenvia a consulta de deadlock:
public static class SqlCommandExtender
{
private const int DEADLOCK_ERROR = 1205;
private const int MAXIMUM_DEADLOCK_RETRIES = 5;
private const int SLEEP_INCREMENT = 100;
public static void ExecuteNonQueryWithDeadlockHandling(this SqlCommand sqlCommand)
{
int count = 0;
SqlException deadlockException = null;
do
{
if (count > 0) Thread.Sleep(count * SLEEP_INCREMENT);
deadlockException = ExecuteNonQuery(sqlCommand);
count++;
}
while (deadlockException != null && count < MAXIMUM_DEADLOCK_RETRIES);
if (deadlockException != null) throw deadlockException;
}
private static SqlException ExecuteNonQuery(SqlCommand sqlCommand)
{
try
{
sqlCommand.ExecuteNonQuery();
}
catch (SqlException exception)
{
if (exception.Number == DEADLOCK_ERROR) return exception;
throw;
}
return null;
}
}
O erro ocorre na linha:
sqlCommand.ExecuteNonQuery();