.net中事宜的使用

.net中事务的使用

事务简单来讲就是一组事情的集合,只有把这一组内的所有事情全部做完才能说完成了这个事务,如果在执行任意一件事情的过程中出现意外,则以前所做过的事情均恢复原样,就跟从来没发生过这件事一样。在编程中事务应用的非常广泛,而且在某些业务上必须要使用事务以应对可能出现的风险。一个典型的例子就是大家所熟悉的银行转账功能,转账简单来讲分为两步,第一步是从一个账户上减去需要转账的金额数目,第二步是向另外一个账户上增加转账金额。只有减去金额和增加金额都完成了我们才说这一事务执行完毕。我们可以想象如果没有加事务处理,当转账过程中只有第一步完成了,但是第二步没有完成便出现了意外这会是一件多么可怕的事情。既然事务这么重要,那事务具体怎样使用呢?下面亮出源码供大家参考:

 public bool Add(ArrayList examNormTemplate)
        {
            //实例化一个DBTransaction对象
            DBTransaction Db = new DBTransaction();
            //获取连接
            SqlConnection conn = Db.GetConnection();
            //获取事务
            SqlTransaction trans = Db.GetTransaction(conn);
            //定义一个布尔型变量
            bool isUseExamTemplate = false;

            try
            { 
                  for (int i = 0; i < examNormTemplate.Count; i++)
                {
                    ExamNormLinkEntity item = (ExamNormLinkEntity)examNormTemplate[i];

                    isUseExamTemplate = examMethod.Add(item, conn, trans);
                }
                //提交事务
                Db.Commit(trans);
                
            }
            catch(Exception e)
            {
                //回滚事务
                Db.Rollback(trans);
                throw e;
            }
            finally
            {   
                //关闭连接
                Db.Close(conn);
            }
            //返回执行结果,如果isUseExamTemplate的值为true说明设定成功,否则设置失败
            return isUseExamTemplate;
        }

上面的代码是B层的一个类的Add方法,它所实现的功能是将ArrayList中的所有数据全部添加入数据库。从中我们可以看出该函数中使用了事务。由于原系统采用的是,U层,B层,D层 + SqlHelper的架构,B层中不可以直接引用SqlHelper来获取链接,所以在D层新建了DBTransaction类,该类的GetConnection方法通过调用SqlHelper类的GetConn方法来简介获取链接。当然我们还可以在DBTransaction类中写一个与SqlHelper类中获取链接的相同方法来取得链接,只不过这样会有代码冗余。下面是DBTransaction类中的代码:

    public class DBTransaction
    {
        //定义一个SqlHelper私有变量
        private SqlHelper SqlHelper = null;
       
        //当实例化该类的时候同时实例化一个Sqlhelper对象
        public DBTransaction()
        {
            SqlHelper = new SqlHelper();
        }

        /// <summary>
        /// 获取数据库连接
        /// </summary>
        /// <returns></returns>
        public SqlConnection GetConnection()
        {
            return SqlHelper.GetCon();
        }

        /// <summary>
        /// 获取事务
        /// </summary>
        /// <returns></returns>
        public SqlTransaction GetTransaction(SqlConnection conn)
        {
            return conn.BeginTransaction();
        }

        /// <summary>
        /// 提交事务
        /// </summary>
        public void Commit(SqlTransaction sqlTransaction)
        {
            sqlTransaction.Commit();
        }

        /// <summary>
        /// 回滚事务
        /// </summary>
        public void Rollback(SqlTransaction sqlTransaction)
        {
            sqlTransaction.Rollback();
        }

        /// <summary>
        /// 关闭连接
        /// </summary>
        public void Close(SqlConnection conn)
        {

            if (conn.State == ConnectionState.Open)
            {
                conn.Close();
            }

        }
    }

事务的原子性决定了事务必须彻底执行完毕,否则将全部回滚,由此在一定程度上解决了安全性问题。本文同时附有Sqlhelper类的代码,想要进一步研究的同学科点击这里进行下载。

3楼xiaokui00814小时前
基础
2楼lsh668823小时前
sql事务
1楼lfmilaoshi前天 15:38
有比较深刻的认识