ASP.NET(C#)事務的創建、提交以及回滾 (附代碼)


1、事務是什么?
            事務是應用程序中一系列嚴密的操作,所有的操作必須全部成功完成,否則每個操作中的所有更改都會被撤銷。也就是事務具有原子性,一個事務中的一系列操作要么全部成功,要么一個都不做。
 2.事務的四大特性
            數據庫事務 transanction 正確執行的四個基本要素。ACID,原子性(Atomicity)、一致性(Correspondence)、隔離性(Isolation)、持久性(Durability)

      (1)原子性:整個事務中的所有操作,要么全部完成,要么全部不完成。事務在執行過程中發生錯誤,會被回滾(Rollback)撤銷操作。
                     (2)一致性:在事務開始之前和事務結束以后,數據庫的完整性約束沒有被破壞。
           (3)隔離性:隔離狀態執行事務,使它們好像是系統在給定時間內執行的唯一操作。如果有兩個事務,運行在相同的時間內,執行 相同的功能,事務的隔離性將確保每一事務在系統中認為只有該事務在使用系          統。這種屬性有時稱為串行化,為了防止事務操作間的混淆,必須串行化或序列化請 求,使得在同一時間僅有一個請求用於同一數據。
           (4)持久性:在事務完成以后,該事務所對數據庫所作的更改便持久的保存在數據庫之中,並不會被回滾。

步入正題,我們經常遇到在對數據進行增、刪、改操作的同時去操作其他數據,以插入一條數據的同時更新另一張表數據為例,
那么在ASP.NET(C#)程序當中我們怎么樣來應用呢?我們來看代碼:

 

 1         public bool Insert(SC_CJ_MRBBModel model)
 2         {
 3             //創建數據庫連接對象
 4             using (SqlConnection conn=new SqlConnection(SqlHelper.SCConnString  /*數據庫連接字符串*/))
 5             {
 6                 conn.Open();                //打開連接
 7                 //開啟事務:標志事務的開始
 8                 using (SqlTransaction tran=conn.BeginTransaction())
 9                 {
10                     try
11                     {
12                         //Insert
13                         string sqlStr = "insert into tableA values(@BZ,@CJRQ,FDCS)";
14                         SqlParameter[] parm = {
15                             new SqlParameter("@BZ",NumericParse.IsStringNull(model.BZ)),
16                             new SqlParameter("@BZ",NumericParse.IsDateNull2(model.CJRQ)),
17                             new SqlParameter("@BZ",NumericParse.IsStringNull(model.FDCS))
18                         };
19                         int count = SqlHelper.ExecuteNonQuery(tran, CommandType.Text, sqlStr.ToString(), parm);
20 
21                         #region 不使用SqlHelper輔助類的情況下
22                         ////創建命令對象
23                         //SqlCommand cmd = new SqlCommand(sqlStr, conn);
24                         ////通過Parameter集合的add()方法天填充參數集合
25                         //cmd.Parameters.Add(parm);
26                         //cmd.Transaction = tran;
27                         //int count = cmd.ExecuteNonQuery();
28                         #endregion
29 
30                         //Update
31                         string uptSqlStr = $"update tableB set A=@BZ where ID=@ID";
32                         SqlParameter[] spr = {
33                              new SqlParameter("@BZ",NumericParse.IsStringNull(model.BZ)),
34                              new SqlParameter("@ID",NumericParse.IsStringNull(model.BZ))
35                         };
36                         SqlHelper.ExecuteNonQuery(tran, CommandType.Text, uptSqlStr.ToString(), spr);
37 
38                         if (count > 0)
39                         {
40                             //如果Insert成功,則提交事務
41                             tran.Commit();
42                             return true;
43                         }
44                         else
45                         {
46                             return false;  //tran.Rollback();  這里直接Rollback也可以
47                         }
48                     }
49                     catch (Exception ex)
50                     {
51                         //如果Insert數據出現問題,則將整個事務回滾
52                         tran.Rollback();
53                         LogHelper.ErrorLog(ex.Message);
54                         return false;
55                         throw ex;
56                     }
57                     finally
58                     {
59                         if (conn.State == ConnectionState.Open && conn != null)
60                         {
61                             conn.Close();
62                             conn.Dispose(); //關閉連接,釋放資源
63                         }
64                     }
65                 }
66             }
67         }

 

 總結:一、asp.net(c#)開啟事務的步驟:

 

          01.調用SqlConnection對象的BeginTransaction()方法,創建一個SqlTransaction對象,標志事務開始。
          02.將創建的SqlTransaction對象分配給要執行的SqlCommand的Transaction屬性。
          03.調用相應的方法執行SqlCommand命令。
          04.調用SqlTransaction的Commit()方法完成事務。或調用Rollback()方法終止事務。

   二、在進行事務操作中的注意點
    01.在調用BeginTransaction()方法開始事務之前,要打開數據庫連接,否則出現異常。
    02.如果在事務的Commit()方法或RollBack()方法執行前數據庫連接斷開或關閉,則事務將回滾。

 

Don't lose hope. You never know what tomorrow will bring.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM