ADO.NET中事务的理解与应用

来源:互联网 发布:单片机的温度控制系统 编辑:程序博客网 时间:2024/06/07 16:28

      事务(Transaction),是指一个工作单元,在这个整体中所有对数据库的操作要么全部执行成功,要不全不执行,用"不成功,便成仁"来形容比较恰当。

     (1)、在ADO.NET中,使用Connection对象的BeginTransaction方法来初始化Transaction对象,然后将该对象赋值给Command对象的一个属性Transaction,执行对数据库的操作,若成功,则调用Transaction对象的Commit方法来提交事务,如若失败,则调用Transaction对象的RollBack方法进行事务的回滚。下面就来写下具体的操作代码:

    .....

    using System.Data.SqlClient;

   ......

  

    string strSQL = string.Empty;

    using(SqlConnection con = new SqlConnection("数据库连接字符串"))

   {

          con.Open();

          SqlTransaction trans = con.BeginTransaction();

          SqlCommand cmd = null;

          cmd.Connection = con;

          cmd.Transaction = trans;

          try

          {

                  strSQL = "insert into Users values('admin','admin')";

                  cmd.CommandText = strSQL;

                  cmd.ExecuteNonQuery();

                 

                  strSQL = "update Users set pwd= ' "+admin888 + " ' where uid=admin";

                  cmd.CommandText = strSQL;

                  cmd.ExecuteNonQuery();

                 

                  trans.Commit();

          }

          catch(SqlException ex)

          {

                  Response.Write(ex.Message);

                  Trans.RollBack();

          }

   }

 

 (2)、分布式事务

         在网站开发中,我们经常会遇到这样一种情况,由于网站访问量非常大,注册的用户又比较多,一台服务器难以储存众多的用户信息,怎么办呢?

         通常的做法是,使用二个或二个以上的服务器,将用户的登录信息放在中心机房的SQL Server数据库服务器中,而将用户的物品消费信息放在另外一个服务器中,这样每次新增加一个用户的话,就得在中心机房的数据库服务器中增加一个用户的信息,同时在另外一个服务器上也得相应增加该用户以及相关的消费信息,这里同样涉及到事务问题,若增加成功,两台数据库服务器中应同时增加了用户的信息,若一台服务器上出现错误,未能保存用户的信息,则另外一台服务器上也不能保存数据,既是事务整体提交失败,回滚到操作前的状态.

        像上面的这种情况,涉及到多个数据库服务器,就牵涉到在2个或2个以上的SqlConnection对象上执行事务,这就是分布式事务处理。

        分布式事务处理,要用到System.Transaction命名空间下的TransactionScope类,在使用之前首先添加System.Transactions.dll

的引用.具体的操作代码如下:

       ......

       ......

       string strSQL = string.Empty;

       using(TransactionScope scope = new TransactionScope())

       {

             SqlConnection con1 = new SqlConnection("数据库连接字符串1");

             SqlConnection con2 = new SqlConnection("数据库连接字符串2");

             try

             {

                    con1.Open();

                    strSQL = "insert into Users values('admin','admin')";

                    SqlCommand cmd1 = new SqlCommand(strSQL,con1);

                    cmd1.ExecuteNonQuery();

 

                    con2.Open();

                    strSQL = "insert into Consumption values('100','admin')";

                    SqlCommand cmd2 = new SqlCommand(strSQL,con2);

                    cmd2.ExecuteNonQuery();

             }

             catch(SqlException ex)

             {

                    Response.Write(ex.Message);

             }

             scope.Complete();

             con1.Close();

             con2.Close();

       }

       .........

      

       分布式事务的处理并不是由ADO.NET来管理的,而是由MSDTC服务来管理的,这是一个基于COM+的技术,DTC是Distributed Transaction Coordinator的缩写,既是分布式服务协调者的意思,由此也可以看出它的作用。

       TransactionScope类所支持的分布式事务管理,也并非由TransactionScope类来完成,而是提交给本地机上的DTC服务来完成的,因此在使用分布式事务时,要开启本机的DTC服务,通过运行net start msdtc命令即可。

原创粉丝点击