Вы можете попробовать использовать класс 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 может предложить много преимуществ по сравнению с управлением транзакциями db вручную.
Желательно, чтобы я мог легко переключиться на транзакции на стороне сервера. У меня есть 500 хранимых процедур в паре с уровнем доступа к данным ADO.NET. Большинство транзакционных вызовов были добавлены в качестве шаблона. – MatthewMartin