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 ;
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.