明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

net中交易處理的處理方案

[摘要]在數(shù)據(jù)庫軟件中,其核心就是對數(shù)據(jù)庫記錄進行查詢添加修改及刪除操作,這是非常關(guān)鍵的也是必須非常謹慎的去完成。在現(xiàn)有的程序中經(jīng)常會有因為某些錯誤而造成數(shù)據(jù)丟失甚至是系統(tǒng)崩潰,這就對我們的程序提出了一個數(shù)...
在數(shù)據(jù)庫軟件中,其核心就是對數(shù)據(jù)庫記錄進行查詢添加修改及刪除操作,這是非常關(guān)鍵的也是必須非常謹慎的去完成。在現(xiàn)有的程序中經(jīng)常會有因為某些錯誤而造成數(shù)據(jù)丟失甚至是系統(tǒng)崩潰,這就對我們的程序提出了一個數(shù)據(jù)操作的錯誤處理要求。

例如在進行銀行轉(zhuǎn)帳處理時,我們先從轉(zhuǎn)出帳號減掉要轉(zhuǎn)出的金額,然后再在接收的帳號上加上相應(yīng)的金額。如果一切處理OK,我們的錢能順利到達接收帳號。但要是系統(tǒng)在執(zhí)行接收金額的步驟上出錯了,那么不但自已錢變少了,該收到的人也沒有收到,那筆錢就這樣消失了.這是一個很危險的現(xiàn)像。解決辦法就是要對數(shù)據(jù)操作的每一步都進行錯誤監(jiān)控,一旦發(fā)現(xiàn)出錯了,馬上恢復(fù)數(shù)據(jù)至整個操作前的原始狀態(tài)。.NET中提出了一個交易(Transaction)的觀念,可以解決此類問題。

我現(xiàn)在來用交易實現(xiàn)上面的例子:

string sql1 = "..."; //在轉(zhuǎn)出帳號上減去金額的處理SQL語句
string sql2 = "..."; //在接收帳號上加上金額的處理SQL語句
SqlConnection conn = new SqlConnection("..."); //建立數(shù)據(jù)庫連接
conn.Open(); //接開數(shù)據(jù)庫連接
SqlTransaction tran = conn.BeginTransaction(); //開始進行交易處理
SqlCommand comm = new SqlCommand();
comm.Connection = conn;
comm.Transaction = tran;
try
{
comm.CommandText = sql1;
comm.ExecuteNonQuery();
comm.CommandText = sql2;
comm.ExecuteNonQuery();
tran.Commit(); //接受交易,完成操作
}catch
{
tran.Rollback(); //交易失敗,恢復(fù)數(shù)據(jù)
}
finally
{
conn.Close(); //關(guān)閉數(shù)據(jù)庫連接。
}

其實還有另外一種方法也可以實現(xiàn)以上目標。在transaction-sql中也提供了交易處理的方法(我想上種方法最終實現(xiàn)還是轉(zhuǎn)換為此方法實現(xiàn)的).我們可以把以上處理建立為一個存儲過程,然后再用SqlCommand進行調(diào)用,這個存儲過程的主要的相關(guān)內(nèi)容為(其中...處代表要進行數(shù)據(jù)庫記錄操作的多條SQL語句):

BEGIN TRANSACTION
...
IF (@@ERROR > 0) ROLLBACK TRANSACTION
ELSE COMMIT TRANSACTION