[英]Would a query run in a try statement that failed if it was before the error occured?
可以說我有以下示例(偽代碼示例)
try{
INSERT SQL to DB 1
INSERT SQL to DB 2
--FAILURE OCCURS HERE FOR SOME REASON AND IT GOES TO CATCH STATEMENT
INSERT SQL to DB 3
}catch(err){
ERROR MESSAGE
}
前兩個查詢是否會在錯誤之前在數據庫上運行?
要么
程序是否會知道存在錯誤並且不運行try語句中的代碼塊,而將海峽跳轉到catch塊?
這是您如何處理存儲過程中描述的情況:
BEGIN TRANSACTION;
BEGIN TRY
INSERT SQL to DB 1
INSERT SQL to DB 2
--FAILURE OCCURS HERE FOR SOME REASON AND IT GOES TO CATCH STATEMENT
INSERT SQL to DB 3
END TRY
BEGIN CATCH
IF (@@TRANCOUNT > 0)
ROLLBACK TRANSACTION;
-- Return 0 value to indicate failure of execution
RETURN 0
END CATCH;
-- If transaction is still active then commit it
IF (@@TRANCOUNT > 0)
COMMIT TRANSACTION;
-- Return 1 value to indicate successful execution of INSERT statements
RETURN 1
如果TRY
塊內的任何 INSERT
語句失敗,則所有這些語句都將回滾。 否則,所有INSERT
查詢都將提交到數據庫。
您可以在C#中實現類似的邏輯,但是通常最好將整個實現包裝在存儲過程中。
編程語言(數據庫適配器/接口)中有多種方法可以處理數據庫級別的事務。 如果這三個查詢沒有被某些代碼包圍,這些代碼實際上打開了一個事務並在使用提交的第三條語句之后結束了該事務,則以上兩個查詢將已經在數據庫上運行並且可以單獨提交。 從您的代碼來看,在這3條語句周圍沒有事務打開/提交/回滾行,這意味着上述兩個語句已經提交到數據庫,因為DB認為它們分別是獨立的事務。 但是,如果將這3條語句包裝在事務打開/提交塊周圍,然后任何一條語句失敗,則已執行的查詢將回滾,因為代碼的catch塊將使DB引擎知道事務已打開且未提交但是發生了一個異常,因此回滾了先前執行的語句。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.