2013-07-16 43 views
-1

當我點擊保存表單按鈕如何控制併發更新3個數據庫表

它調用3種方法:

這3種方法更改保存到3個數據庫表

所以情況是要麼所有的3個表都應該更新,否則不應該得到更新。

我使用C#和Microsoft SQL Server數據庫

+2

你需要圍繞同一個數據庫事務的方法。但是,當你在這裏提出問題時,你需要說出使用什麼語言和方法來訪問你正在使用的數據庫。否則,我們該如何幫助你? –

+0

謝謝你的回覆 我使用C#和微軟SQL數據庫 你可以告訴我如何用示例代碼 – deva

+0

你能提供save_方法的內容嗎? –

回答

0

所有更新語句必須是內transactionMore

如果您正在使用Stored procedure請使用以下方法編寫存儲過程。即全部三個Update陳述inside a single transaction。所以,你可以提交,如果一切都得到了,否則更新將是如果你使用SQL查詢和ADO

使用以下梅索德卷備份

CREATE/ALTER PROCEDURE Proc_Name 
AS 
BEGIN TRY 
    BEGIN TRAN 

-- Your Update Statements 

    COMMIT TRAN 
END TRY 
BEGIN CATCH 
    ROLLBACK TRAN 
END CATCH 

private static void Update() 
    { 
     SqlConnection db = new SqlConnection("strConectionString"); 
     SqlTransaction transaction; 

     db.Open(); 
     transaction = db.BeginTransaction(); 
     try 
     { 
     new SqlCommand("update quey1", db, transaction) 
      .ExecuteNonQuery(); 
     new SqlCommand("update quey2", db, transaction) 
      .ExecuteNonQuery(); 
     new SqlCommand("update quey3", db, transaction) 
      .ExecuteNonQuery(); 
     transaction.Commit(); 
     } 
     catch (SqlException sqlError) 
     { 
     // always log or rethrow exceptions! 
     transaction.Rollback(); 
     db.Close(); 
     // 
     throw; 
     } 
     db.Close(); 
    } 

[編輯] 當你得到失敗時,你應該一直記錄(如果你能處理它)或者重新拋出它。否則,異常跡線&關鍵診斷信息將被吞噬在'catch`塊中。

在這種情況下,我建議重新向外拋出 - 因爲最外層的系統或應用程序線程應處理異常,並在該點處記錄它。如果發生異常,更新明顯失敗&業務邏輯不應該繼續。

+0

如果你沒有做任何事情,不需要捕捉特定的異常。你也需要重新拋出它。我編輯了你的答案。 – Ehsan

0

而不是將3個調用發送到數據庫。您應該編寫一個存儲過程,爲您執行所有3個功能。你應該在那裏申請交易。 How to implement transaction in stored procedure

如果您想保留3種方法,那麼您也可以在代碼級應用事務。

 SqlConnection conn = new SqlConnection("Your Connection string"); 
     conn.Open() 
     using (SqlTransaction tran = conn.BeginTransaction()) { 
     try { 
     // your code 
     tran.Commit(); 
     } catch { 
     tran.Rollback(); 
     throw; 
     } 
     } 
+0

我不喜歡存儲過程,其中沒有真正的遺留兼容性或數據庫性能原因。它們不可移植,可見或易於調試/維護。 –

+2

這是自己的選擇。我也提供了其他解決方案。 – Ehsan

+0

是的,您在例外情況中提出了一些優點。謝謝! –

2

如果你不想重寫你的功能,你可以使用TransactionScope

using (TransactionScope scope = new TransactionScope()) 
{ 
    try 
    { 
     save_Purchase(); 
     save_dtPurcaseProduct(); 
     save_dtPurchaseProductExp(); 

     scope.Complete(); //All goes well, then commit your transaction 
    } 
    catch(Exception ex) 
    { 
     //Do not call complete, on exit of transactionscope, transaction will rollback 
    } 
} 
+0

不是一個不好的解決方案,如果現有的方法是兼容的。 +1! –