2015-05-27 40 views
1

可以說我有下面的例子(僞碼示例)查詢是否會在發生錯誤之前的try語句中失敗?

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 
} 

會因爲他們的錯誤之前的前兩個查詢的是對DB運行?

請問程序知道那裏有一個錯誤,而不是在try語句運行代碼塊和跳轉海峽catch塊?

+0

如果你在代碼中放置一個事務,那麼當發生錯誤時你可以回滾所有的東西。 –

+4

是的,他們會得到執行。您需要交易來處理這種情況。 –

+0

好的,謝謝我看到你的話:) –

回答

2

這是你能如何處理您在存儲過程中所描述的情況:如果是任何INSERT聲明TRY塊內發生故障,那麼這些語句的所有

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 

回滾。否則,所有INSERT查詢都將被提交到數據庫。

您可以在C#中實現類似的邏輯,但通常最好將整個實現包裝在存儲過程中。

0

編程語言(DB適配器/接口)有幾種方式可以處理數據庫級別的事務。如果這三個查詢沒有包含一些基本上打開一個事務的代碼,並在使用提交的第三個語句之後結束它,那麼上述兩個查詢將已經在數據庫上運行並單獨提交。 從你的代碼判斷,沒有事務打開/提交/回滾行包含在3個語句中,這意味着上述兩個語句已經被提交到數據庫,因爲數據庫認爲它們是單獨的事務。 但是,如果將這3個語句包裝在事務打開/提交塊周圍,並且如果任何一個語句失敗,則已執行的查詢將回滾,因爲代碼的catch塊會讓DB引擎知道該事務處於打開狀態承諾但發生異常,因此回滾以前執行的語句。

相關問題