c#中事物使用

 

數據庫事務(簡稱: 事務)是數據庫管理系統執行過程當中的一個邏輯單位,由一個有限的數據庫操做序列構成。當事務被提交給了DBMS(數據庫管理系統),則DBMS(數據庫管理系統)須要確保該事務中的全部操做都成功完成且其結果被永久保存在數據庫中,若是事務中有的操做沒有成功完成,則事務中的全部操做都須要被回滾,回到事務執行前的狀態;同時,該事務對數據庫或者其餘事務的執行無影響,全部的事務都好像在獨立的運行。sql

事務的特性(ACID性質)數據庫

 

原子性(Atomic) 數組

事務做爲一個總體被執行,包含在其中的對數據庫的操做要麼所有被執行,要麼都不執行。併發

一致性(Consistency) 函數

事務應確保數據庫的狀態從一個一致狀態轉變爲另外一個一致狀態。一致狀態的含義是數據庫中的數據應知足完整性約束。ui

隔離性(Isolation) spa

多個事務併發執行時,一個事務的執行不該影響其餘事務的執行。.net

持久性(Durability) blog

已被提交的事務對數據庫的修改應該永久保存在數據庫中。事務

 

下面介紹事務的具體使用。

事務在數據庫中的使用

 

[sql]  view plain  copy
 
  1. BEGIN TRANSACTION  
  2.     --向Table1表中插入記錄  
  3.     INSERT INTO Table1 VALUES('1','1')  
  4.     SET @Err1=@@ERROR  
  5.       
  6.     --向Table2表插入記錄  
  7.     INSERT INTO Table2 VALUES('1','1')  
  8.     SET @Err2=@@ERROR  
  9.   
  10.     IF(@Err1=0 AND @Err2=0)  
  11.         COMMIT TRANSACTION  --事務提交  
  12.     ELSE  
  13.         ROLLBACK TRANSACTION    --事務回滾  

@@ERROR:完成 Transact-SQL 語句的執行時,若是語句執行成功,則 @@ERROR 設置爲 0。若出現一個錯誤,則返回一條錯誤信息。@@ERROR 返回此錯誤信息代碼,直到另外一條 Transact-SQL 語句被執行。

 

 

事務在.NET代碼中的使用

首先添加引用usingSystem.Transactions;

 (1)只在D層使用事務

 

[csharp]  view plain  copy
 
  1. //設定事務的級別  
  2. TransactionOptions option = new TransactionOptions();  
  3. option.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;  
  4. using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required, option))  
  5. {  
  6.     //標誌是否更改爲功  
  7.     bool flag = false;  
  8.     bool flagUpdate = false;  
  9.                       
  10.     //更新Table1中數據  
  11.     string sqlUpText = "UPDATE Table1 SET actionReason = '1'";  
  12.     flagUpdate = sqlHelper.ExecuteNonQuery(sqlUpText,CommandType.Text);  
  13.                   
  14.     //更新Table2中數據  
  15.     string sqlText = "UPDATE Table2 SET isAvailable ='否' ";  
  16.     flag = sqlHelper.ExecuteNonQuery(sqlText, CommandType.Text);  
  17.     if (flag && flagUpdate)  
  18.     {  
  19.         ts.Complete();  
  20.         return true;  
  21.     }  
  22.     else {  
  23.         return false;  
  24.     }  
  25. }  


 

(2)事務在B層的使用
B層代碼

 

[csharp]  view plain  copy
 
  1. //首先引用 System.Data和System.Data.SqlClient命名空間  
  2. //定義事務執行所使用的連接  
  3. SqlConnection sqlCon = new SqlConnection(ConfigurationManager.ConnectionStrings["strConnDB"].ToString());  
  4.   
  5. //打開鏈接  
  6. sqlCon.Open();  
  7.   
  8. //定義事務  
  9. SqlTransaction sqlTran = sqlCon.BeginTransaction(IsolationLevel.ReadCommitted);  
  10. //用try...Catch...finally保證事務在出錯時會回滾  
  11. try  
  12. {  
  13.     //向課程表中添加數據  
  14.     OptionalCourseScheduleLinkDAL OptionalCourseSchedule = new OptionalCourseScheduleLinkDAL();  
  15.     //將新創建的鏈接和事務一塊兒傳回D層  
  16.     IsAddOptionalCourseSchedule = OptionalCourseSchedule.AddOptionalCourseSchedule(enOptionalCourseSchedule,sqlCon,sqlTran);  
  17.   
  18.     //更新授課關係表中的單雙週  
  19.     CourseTeachClassLinkDAL CourseTeachClass = new CourseTeachClassLinkDAL();  
  20.     //添加D層的方法,調用sqlHelper中執行事務的方法:ExecNoSelect(string cmdText, SqlParameter[] paras, CommandType cmdType, SqlConnection sqlConns, SqlTransaction sqlTran)  
  21.     //將新創建的鏈接和事務一塊兒傳回D層  
  22.     IsUpdateCourseTeachClass = CourseTeachClass.UpdateCourseTeachClassOddEven(enCourseTeachClass,sqlCon,sqlTran);  
  23.   
  24.     //若添加和更新有一者返回false,事務回滾  
  25.     if (IsAddOptionalCourseSchedule && IsUpdateCourseTeachClass)  
  26.     {  
  27.         //若是都爲真,提交  
  28.         sqlTran.Commit();  
  29.         sqlCon.Close();  
  30.         return true;  
  31.     }  
  32.     else {  
  33.         sqlTran.Rollback();  
  34.     }  
  35.   
  36. }  
  37. catch (Exception)  
  38. {  
  39.     //出現異常時,事物回滾  
  40.     sqlTran.Rollback();  
  41. }  
  42.   
  43. finally {  
  44.     sqlCon.Close();  
  45. }  
  46. return false;  

D層代碼

 

 

[csharp]  view plain  copy
 
  1. public Boolean AddOptionalCourseSchedule(OptionalCourseScheduleLinkEntity enOptionalCourseScheduleLink, SqlConnection sqlCon, SqlTransaction sqlTran)  
  2. {  
  3.   
  4.     //聲明一個布爾型變量  
  5.     Boolean blnIsResult = false;  
  6.     //執行SQL字符串名  
  7.     string strSQL = "insert into TBR_OptionalCourseScheduleLink(TeachClassID,RoomID,WorkDay,ClassBegin,ClassEnd) VALUES(@TeachClassID,@RoomID,@WorkDay,@ClassBegin,@ClassEnd)";  
  8.     //字符串數組  
  9.     SqlParameter[] param = new SqlParameter[]  
  10.     {  
  11.         new SqlParameter("@TeachClassID",enOptionalCourseScheduleLink.TeachClassID),//虛擬班ID  
  12.         new SqlParameter("@RoomID",enOptionalCourseScheduleLink.RoomID),//房間ID  
  13.         new SqlParameter("@WorkDay",enOptionalCourseScheduleLink.WorkDay),//星期  
  14.         new SqlParameter("@ClassBegin",enOptionalCourseScheduleLink.ClassBegin),//開始時間(如:上午第一節)  
  15.         new SqlParameter("@ClassEnd",enOptionalCourseScheduleLink.ClassEnd)//結束時間  
  16.              
  17.     };  
  18.     //SQL語句類型  
  19.     CommandType cmdType = CommandType.Text;  
  20.     //SQLHELPER函數返回值  
  21.     blnIsResult = sqlHelper.ExecNoSelect(strSQL, param, cmdType, sqlCon, sqlTran);  
  22.     //返回函數值  
  23.     return blnIsResult;  
  24. }  

SqlHelper中關於事務的代碼

 

 

[csharp]  view plain  copy
 
  1. #region 執行sql語句(事務中使用)  
  2. /// <summary>執行sql語句(事務中使用)  
  3. /// 執行sql語句(事務中使用)  
  4. /// </summary>  
  5. /// <param name="cmdText">在事務中執行的某個SQL語句或存儲過程</param>  
  6. /// <param name="paras">參數集合</param>  
  7. /// <param name="cmdType">命令類型</param>  
  8. /// <param name="sqlConn">數據庫鏈接</param>  
  9. /// <param name="sqlTran">事務</param>  
  10. public Boolean ExecNoSelect(string cmdText, SqlParameter[] paras, CommandType cmdType, SqlConnection sqlConns, SqlTransaction sqlTran)  
  11. {  
  12.     try  
  13.     {  
  14.         //實例化數據庫命令SqlCommand  
  15.         sqlCmd = new SqlCommand(cmdText, sqlConns);  
  16.         //命令類型:存儲過程or SQL語句  
  17.         sqlCmd.CommandType = cmdType;  
  18.         //添加參數  
  19.         sqlCmd.Parameters.AddRange(paras);  
  20.         //事務  
  21.         sqlCmd.Transaction = sqlTran;  
  22.         //定義事務執行結果  
  23.         int intResult = sqlCmd.ExecuteNonQuery();  
  24.         //執行事務:大於0返回true,不然返回false。  
  25.         if (intResult > 0)  
  26.         {  
  27.             //事務執行成功  
  28.             return true;  
  29.         }  
  30.         else  
  31.         {  
  32.             //事務執行失敗  
  33.             return false;  
  34.         }  
  35.   
  36.     }  
  37.     catch (Exception ex)  
  38.     {  
  39.         //拋出異常  
  40.         throw ex;  
  41.     }  
  42. }  
  43. #endregion  
相關文章
相關標籤/搜索