考慮下面的代碼,如果發現異常,它不會回滾事務。ADO.NET:你需要回滾事務嗎?
transaction = connection.BeginTransaction();
command.Transaction = transaction;
try {
// interact with database here
catch {}
finally {
connection.Close();
}
這是什麼後果,是否有必要回滾交易?
考慮下面的代碼,如果發現異常,它不會回滾事務。ADO.NET:你需要回滾事務嗎?
transaction = connection.BeginTransaction();
command.Transaction = transaction;
try {
// interact with database here
catch {}
finally {
connection.Close();
}
這是什麼後果,是否有必要回滾交易?
它會在數據庫上留下一個打開的事務,這可能會阻止其他查詢。
從here摘自:
考慮以下一般 準則,當您使用事務 ,這樣就可以避免造成 死鎖:
總是訪問表中的順序相同 跨越交易在您的 應用程序。當您訪問 表時,如果您訪問它們時每次訪問 表會以不同的順序增加 死鎖的可能性。
保持交易爲 儘可能短。不要讓 阻塞或從 事務中長時間撥打電話。保持交易的持續時間短。一種方法是 運行事務接近數據源 。例如,從存儲過程運行事務 而不是運行 不同計算機的事務的 。
選擇級別爲 的隔離,以平衡併發性 和數據完整性。可串行化的最高隔離級別爲 ,降低了併發性並提供了最高級別的數據完整性。最低的 隔離級別,未提交讀取, 給出相反的結果。
最好是生成一個使用塊像這裏面您的交易:
using(/*code to create the transaction you want)
{
//perform your transaction here
transaction.Commit();
}
如果你調用commit之前代碼失敗,它會自動回滾爲使用塊退出。
嘗試一下 - 引發異常並查看結果。您報告的錯誤將關於未被回滾的事務,這將隱藏實際拋出的任何異常。 – Paddy 2011-03-08 09:04:32
@Paddy:你是否說將拋出關於未被回滾的事務的異常? – 2011-03-08 13:24:00