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()方法执行前数据库连接断开或关闭,则事务将回滚。