日期:2014-06-10  浏览次数:20444 次

  今天重新看了一遍《asp.net高级程序设计第四版》的第七章,关于asp.net的事务处理这一块,之前看的时候由于工作中也没有用到它所以没怎么在意,不过真是应了那句话:温故而知新呀。

  今天的内容不是很多,代码演示也不多,所以可以早早写完休息。

  事务:事务可以理解为一种必须同时完成或全部失败的操作。书中的经典例子:账户转账,A账户与B账户之前必须A-100同时B+100,这个操作必须同时成功,只要有个失败两个步骤都需要回滚,这样的一个完整过程就可以称为一个【事务】。


 

  整个小节讲解事务处理可以归纳为以下几点:

  • 存储过程实现事务:这是实现事务的一种比较好的方式。

       语法:BEGIN TRANSACTION 

       成功:COMMIT

       失败:ROLLBACK

 下面是一个比较简单的是个例子主要是为了演示一下用法:

CREATE PROCEDURE myTransaction(
@amount MONEY,---转账金额
@countA INT,--账户A
@countB INT--账户B
)
AS 
BEGIN TRANSACTION

  ---这里是你自定义的SQL更新语句A
   /*
  
  
  
  
  
  
  
  
  */
  --@@ERROR始终是一个记录当前执行SQL错误信息的变量,每一个更新之后会重新自动置0
  IF(@@ERROR>0)
    ROLLBACK
  ---这里是你自定义的SQL更新语句B
  /*
  
  
  
  
  
  
  
  
  */
  IF(@@ERROR>0)
    ROLLBACK
  ---全部更新已经执行完成 
  COMMIT   --更新事务状态
  RETURN
  
  
  • ADO.NET实现事务

       语法:通过调用connection对象的 BeginTransaction()方法开始,该方法返回一个Transaction对象,用于管理事务。由于ADO.NET针对不同的数据库提供程序提供不同的ADO.NET对象,对应的事务对象类名也不一样如:SqlTransaction OledbTransaction OracleTransaction,这里就以SQL Server数据提供程序为例,提供一个标准例子,主要是演示用法:

      成功:con.Commit();

      失败:con.Rollback();

   SqlConnection con=new SqlConnection(strConnect);
            SqlCommand cmd1 = new SqlCommand(strSQL1,con);
            SqlCommand cmd2 = new SqlCommand(strSQL2, con);
             SqlTransaction tran=null;
            try
            {
                con.Open();
                 tran = con.BeginTransaction();  //创建事务
                
                //将Cmd对象提交到事务中
                cmd1.Transaction = tran;
                cmd2.Transaction = tran;

                //执行更新
                cmd1.ExecuteNonQuery();
                cmd2.ExecuteNonQuery();

                //全部更新成功,刷新事务状态
                tran.Commit();

            }
            catch
            {
                //更新失败事务回滚
                tran.Rollback();

            }
            finally {
                con.Close();
            }

 

  • COM+实现事务:不过书中没有细节去讨论这一块。