當我點擊保存表單按鈕如何控制併發更新3個數據庫表
它調用3種方法:
這3種方法更改保存到3個數據庫表
所以情況是要麼所有的3個表都應該更新,否則不應該得到更新。
我使用C#和Microsoft SQL Server數據庫
當我點擊保存表單按鈕如何控制併發更新3個數據庫表
它調用3種方法:
這3種方法更改保存到3個數據庫表
所以情況是要麼所有的3個表都應該更新,否則不應該得到更新。
我使用C#和Microsoft SQL Server數據庫
所有更新語句必須是內transaction
。 More
如果您正在使用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`塊中。
在這種情況下,我建議重新向外拋出 - 因爲最外層的系統或應用程序線程應處理異常,並在該點處記錄它。如果發生異常,更新明顯失敗&業務邏輯不應該繼續。
如果你沒有做任何事情,不需要捕捉特定的異常。你也需要重新拋出它。我編輯了你的答案。 – Ehsan
而不是將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;
}
}
我不喜歡存儲過程,其中沒有真正的遺留兼容性或數據庫性能原因。它們不可移植,可見或易於調試/維護。 –
這是自己的選擇。我也提供了其他解決方案。 – Ehsan
是的,您在例外情況中提出了一些優點。謝謝! –
如果你不想重寫你的功能,你可以使用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
}
}
不是一個不好的解決方案,如果現有的方法是兼容的。 +1! –
你需要圍繞同一個數據庫事務的方法。但是,當你在這裏提出問題時,你需要說出使用什麼語言和方法來訪問你正在使用的數據庫。否則,我們該如何幫助你? –
謝謝你的回覆 我使用C#和微軟SQL數據庫 你可以告訴我如何用示例代碼 – deva
你能提供save_方法的內容嗎? –