2011-03-08 83 views
5

考慮下面的代碼,如果發現異常,它不會回滾事務。ADO.NET:你需要回滾事務嗎?

transaction = connection.BeginTransaction(); 
command.Transaction = transaction; 
try { 
    // interact with database here 
catch {} 
finally { 
    connection.Close(); 
} 

這是什麼後果,是否有必要回滾交易?

+0

嘗試一下 - 引發異常並查看結果。您報告的錯誤將關於未被回滾的事務,這將隱藏實際拋出的任何異常。 – Paddy 2011-03-08 09:04:32

+0

@Paddy:你是否說將拋出關於未被回滾的事務的異常? – 2011-03-08 13:24:00

回答

2

它會在數據庫上留下一個打開的事務,這可能會阻止其他查詢。

here摘自:

考慮以下一般 準則,當您使用事務 ,這樣就可以避免造成 死鎖:

  • 總是訪問表中的順序相同 跨越交易在您的 應用程序。當您訪問 表時,如果您訪問它們時每次訪問 表會以不同的順序增加 死鎖的可能性。

  • 保持交易爲 儘可能短。不要讓 阻塞或從 事務中長時間撥打電話。保持交易的持續時間短。一種方法是 運行事務接近數據源 。例如,從存儲過程運行事務 而不是運行 不同計算機的事務的 。

  • 選擇級別爲 的隔離,以平衡併發性 和數據完整性。可串行化的最高隔離級別爲 ,降低了併發性並提供了最高級別的數據完整性。最低的 隔離級別,未提交讀取, 給出相反的結果。

+1

+1。這是一個潛在的長期交易,直到GC啓動,保持所有鎖定。可能對性能造成破壞性影響。 – TomTom 2011-03-08 09:02:57

+0

當連接關閉而未提交時,交易結束。我不明白爲什麼這被接受。交易需要連接。如果連接消失了,tran也是如此。 – usr 2016-07-07 18:57:34

14

最好是生成一個使用塊像這裏面您的交易:

using(/*code to create the transaction you want) 
{ 
    //perform your transaction here 
    transaction.Commit(); 
} 

如果你調用commit之前代碼失敗,它會自動回滾爲使用塊退出。