您可以尝试使用 .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,如果只涉及单个服务器,则默认情况下允许对 SQL Server 进行轻量级事务。如果事务涉及多个服务器或分布式资源管理器,TransactionScope封装的Transaction会被提升为分布式事务,这需要MSDTC协调,这会使TransactionScope的使用变得复杂。如果您的所有事务都是轻量级的,那么 TransactionScope 可以比手动管理您的数据库事务提供很多好处。