zoukankan      html  css  js  c++  java
  • 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.

  • 相关阅读:
    集合框架之——迭代器并发修改异常ConcurrentModificationException
    Python day 3 (3) 判断与循环
    hdu 5335 Walk Out(bfs+斜行递推) 2015 Multi-University Training Contest 4
    hdu 2473 Junk-Mail Filter(并查集_虚节点)2008 Asia Regional Hangzhou
    hdu 1573 x问题(中国剩余定理)HDU 2007-1 Programming Contest
    hdu 3461 Code Lock(并查集)2010 ACM-ICPC Multi-University Training Contest(3)
    hdu 2155 小黑的镇魂曲(dp) 2008信息工程学院集训队——选拔赛
    hdu 4081 Qin Shi Huang's National Road System(最小生成树+dp)2011 Asia Beijing Regional Contest
    hdu 3938 Portal(并查集+离线+kruskal)2011 Multi-University Training Contest 10
    hdu 3172 Virtual Friends(并查集)University of Waterloo Local Contest 2008.09
  • 原文地址:https://www.cnblogs.com/guozhaoxin/p/11929409.html
Copyright © 2011-2022 走看看