2013-01-21 61 views
0

我有一些命令喜歡插入,更新,創建等,我想在SQL實例中的某些數據庫中運行它們。 我使用事務範圍爲此,我想運行所有的數據庫上的所有命令,即使發生了一些錯誤。 如果發生了一些錯誤,我想向用戶顯示所有錯誤,而不提交正確的命令。 但在交易中,當它達到第一個錯誤時,它會回滾,我不能繼續運行其他命令。 我的命令是這樣的:需要一個TransactionScope,它將不會與例外回滾

using Trans as new TransactionScope 

con.open() 

for i as integer = 0 to n 

Try 
    com.commandtext = coms(i) 
    com.executenonquery() 

catch ex as exception 
    errorCollection.add(ex.message) 
    continue for 

end try 

next 

end using 

回答

2

的方式交易工作是SQL Server的實際跟蹤發生的任何錯誤。如果在事務中發生任何錯誤,SQL Server會聲明事務錯誤,並且不允許在同一事務中發送任何進一步的聲明。因此,即使SQL錯誤是由應用程序中的try/catch塊處理的,該事務在SQL Server上也已失敗,並因此在發送下一個命令時失敗。

唯一可行的選擇是基本上在事務中運行每個命令,然後將它們回滾,無論它們是否失敗併成功。如果一切都成功了,那麼你可以在一個大事務中運行它們並提交。這隻有在它們完全獨立時纔有效。

你最好的選擇可能是解決它,基本上接受你可能只會得到第一個錯誤。

+0

是的,我想我必須使用這種方式,再次感謝! – eFarzad

2

將異常處理移入SQL中,請參見Exception Handling and Nested Transactions。決定哪些例外可以安全處理,哪些必須進一步提出以及哪些可以安全地忽略。絕大多數例外不能被忽略。即使是那些可能被忽略的情況,絕大多數人都必須考慮整個事務上下文,以便它們不會使數據不一致。請注意,並非所有異常都可以通過回滾到保存點來處理,但在已經銷燬事務(例如,死鎖)之後,將會引發某些異常

總的來說,我會分類你的要求在類別極差的判斷思路

+0

謝謝,這是一個很好的觀點,但我認爲這對分佈式事務不好。 – eFarzad

相關問題