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()方法執行前數據庫連接斷開或關閉,則事務將回滾。