Вы можете попробовать использовать класс TransactionScope из пространства имен .NET 2.0 System.Transactions. Этот класс позволяет указать время ожидания, после которого транзакция будет автоматически отменена и откатана. ADO.NET в .NET 2.0+ поддерживает TransactionScope и автоматически зарегистрирует DbTransaction в области, если он присутствует во время вызова базы данных:
public void DoSomething()
{
using (TransactionScope scope = new TransactionScope(TransactionScopeOptions.Required, TimeSpan.FromSeconds(60)))
{
MyDac();
scope.Complete(); // If timeout occurrs, this line is never hit, scope is disposed, which causes rollback if Complete() was not called
}
}
public class MyDac()
{
using (SqlConnection ...)
{
using (SqlCommand ...)
{
// Do something with ADO.NET here...it will autoenroll if a transaction scope is present
}
}
}
TransactionScope внутренне создает System.Transactions.Transaction, которая по умолчанию разрешает выполнение легких транзакций для SQL Server, если задействован только один сервер. Если в транзакции участвует несколько серверов или администраторов распределенных ресурсов, Транзакция, заключенная в TransactionScope, будет преобразована в распределенную транзакцию, для которой потребуется MSDTC для координации, что может усложнить использование TransactionScope. Если все ваши транзакции легковесны, TransactionScope может предложить множество преимуществ по сравнению с управлением транзакциями БД вручную.