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

  • 相关阅读:
    WPF中用户控件对比自定义控件(UserControl VS CustomControl) upcode
    WinCE7开发过程 upcode
    App/Shell启动过程 upcode
    WinCE启动过程 upcode
    ASP.NET 4.0验证请求 A potentially dangerous Request.Form value was detected from the client
    HTML5 开发工具推荐
    用.NET部署卸载window服务
    C#去除HTML标签方法
    正在中止线程 的问题解决
    【转载】纯CSS画的基本图形(矩形、圆形、三角形、多边形、爱心、八卦等)
  • 原文地址:https://www.cnblogs.com/guozhaoxin/p/11929409.html
Copyright © 2020-2023  润新知