.NET 2.0 の System.Transactions 名前空間の TransactionScope クラスを使用してみることができます。このクラスを使用すると、トランザクションが自動的にキャンセルされてロールバックされるまでのタイムアウトを指定できます。.NET 2.0 以降の ADO.NET は TransactionScope に対応しており、データベースの呼び出し時に DbTransaction が存在する場合は、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 を内部的に作成します。これにより、既定では、1 つのサーバーのみが関与している場合に SQL Server への軽量トランザクションが許可されます。トランザクションに複数のサーバーまたは分散リソース マネージャーが関与している場合、TransactionScope によってラップされたトランザクションは分散トランザクションに昇格され、MSDTC による調整が必要になり、TransactionScope の使用が複雑になる可能性があります。すべてのトランザクションが軽量である場合、TransactionScope は、db トランザクションを手動で管理するよりも多くの利点を提供できます。