У меня было это недавно после рефакторинга в новом диспетчере соединений. Новая подпрограмма приняла транзакцию, чтобы ее можно было запустить как часть пакета, проблема была в блоке using:
public IEnumerable<T> Query<T>(IDbTransaction transaction, string command, dynamic param = null)
{
using (transaction.Connection)
{
using (transaction)
{
return transaction.Connection.Query<T>(command, new DynamicParameters(param), transaction, commandType: CommandType.StoredProcedure);
}
}
}
Похоже, что внешнее использование закрывало базовое соединение, поэтому любые попытки зафиксировать или откатить транзакцию вывели сообщение "This SqlTransaction has completed; it is no longer usable."
Я удалил записи, добавил тест на покрытие, и проблема исчезла.
public IEnumerable<T> Query<T>(IDbTransaction transaction, string command, dynamic param = null)
{
return transaction.Connection.Query<T>(command, new DynamicParameters(param), transaction, commandType: CommandType.StoredProcedure);
}
Проверьте все, что может закрывать соединение, находясь в контексте транзакции.