你可以嘗試使用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可以提供很多手動管理數據庫事務的好處。
我希望我可以很容易地切換到主要是服務器端交易。我有500個存儲過程與代碼生成的ADO.NET數據訪問層配對。大多數事務調用已被添加爲樣板。 – MatthewMartin 2009-05-23 13:15:09