今天重新看了一遍《asp.net高級程序設計第四版》的第七章,關於asp.net的事務處理這一塊,之前看的時候由於工作中也沒有用到它所以沒怎麼在意,不過真是應了那句話:溫故而知新呀。
今天的內容不是很多,代碼演示也不多,所以可以早早寫完休息。
事務:事務可以理解為一種必須同時完成或全部失敗的操作。書中的經典例子:賬戶轉賬,A賬戶與B賬戶之前必須A-100同時B+100,這個操作必須同時成功,只要有個失敗兩個步驟都需要回滾,這樣的一個完整過程就可以稱為一個【事務】。
整個小節講解事務處理可以歸納為以下幾點:
語法:BEGIN TRANSACTION
成功:COMMIT
失敗:ROLLBACK
下面是一個比較簡單的是個例子主要是為了演示一下用法:
CREATE PROCEDURE myTransaction( @amount MONEY,---轉賬金額 @countA INT,--賬戶A @countB INT--賬戶B ) AS BEGIN TRANSACTION ---這裡是你自定義的SQL更新語句A /* */ --@@ERROR始終是一個記錄當前執行SQL錯誤信息的變量,每一個更新之後會重新自動置0 IF(@@ERROR>0) ROLLBACK ---這裡是你自定義的SQL更新語句B /* */ IF(@@ERROR>0) ROLLBACK ---全部更新已經執行完成 COMMIT --更新事務狀態 RETURN
語法:通過調用connection對象的 BeginTransaction()方法開始,該方法返回一個Transaction對象,用於管理事務。由於ADO.NET針對不同的數據庫提供程序提供不同的ADO.NET對象,對應的事務對象類名也不一樣如:SqlTransaction OledbTransaction OracleTransaction,這裡就以SQL Server數據提供程序為例,提供一個標准例子,主要是演示用法:
成功:con.Commit();
失敗:con.Rollback();
SqlConnection con=new SqlConnection(strConnect); SqlCommand cmd1 = new SqlCommand(strSQL1,con); SqlCommand cmd2 = new SqlCommand(strSQL2, con); SqlTransaction tran=null; try { con.Open(); tran = con.BeginTransaction(); //創建事務 //將Cmd對象提交到事務中 cmd1.Transaction = tran; cmd2.Transaction = tran; //執行更新 cmd1.ExecuteNonQuery(); cmd2.ExecuteNonQuery(); //全部更新成功,刷新事務狀態 tran.Commit(); } catch { //更新失敗事務回滾 tran.Rollback(); } finally { con.Close(); }