C#数据库事务原理及实践之三(转)

本文介绍了如何在C#中使用SqlTransaction类实现数据库事务处理,包括事务的开始、提交及回滚等基本操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

事务的开启和提交
??现在我们对事务的概念和原理都了然于心了,并且作为已经有一些基础的C#开发者,我们已经熟知编写数据库交互程序的一些要点,即使用SqlConnection类的对象的Open()方法建立与数据库服务器的连接,然后将该连接赋给SqlCommand对象的Connection属性,将欲执行的SQL语句赋给它的CommandText属性,于是就可以通过SqlCommand对象进行数据库操作了。对于我们将要编写的事务处理程序,当然还需要定义一个SqlTransaction类型的对象。并且看到SqlCommand对象的Transcation属性,我们很容易想到新建的SqlTransaction对象应该与它关联起来。

??基于以上认识,下面我们就开始动手写我们的第一个事务处理程序。我们可以很熟练地写出下面这一段程序:

//DoTran.csusing System;
using System.Data;
using System.Data.SqlClient;
namespace Aspcn
{
  public class DbTran
  {
   file://执行事务处理
   public void DoTran()
   {
    file://建立连接并打开
    SqlConnection myConn=GetConn();
    myConn.Open();
    SqlCommand myComm=new SqlCommand();
    SqlTransaction myTran=new SqlTransaction();
    try
    {
    myComm.Connection=myConn;
    myComm.Transaction=myTran;

     file://定位到pubs数据库 
     myComm.CommandText="USE pubs";
     myComm.ExecuteNonQuery();

     file://更新数据
     file://将所有的计算机类图书
     myComm.CommandText="UPDATE roysched SET royalty = royalty * 1.10 WHERE title_id LIKE 'Pc%'";
     myComm.ExecuteNonQuery();//提交事务
     myTran.Commit();
    }
    catch(Exception err)
    {
     throw new ApplicationException("事务操作出错,系统信息:"+err.Message);
    }
    finally
    {
     myConn.Close();
    }
   }
   file://获取数据连接
   private SqlConnection GetConn()
   {
    string strSql="Data Source=localhost;Integrated Security=SSPI;user id=sa;password=";
    SqlConnection myConn=new SqlConnection(strSql);
    return myConn;
   }
  }

  public class Test{public static void Main()
  {
   DbTran tranTest=new DbTran();
   tranTest.DoTran();
   Console.WriteLine("事务处理已经成功完成。");
   Console.ReadLine();
  }
}
}

??显然,这个程序非常简单,我们非常自信地编译它,但是,出乎意料的结果使我们的成就感顿时烟消云散:

?? error CS1501: 重载"SqlTransaction"方法未获取"0"参数

??是什么原因呢?注意到我们初始化的代码:

SqlTransaction myTran=new SqlTransaction();

??显然,问题出在这里,事实上,SqlTransaction类并没有公共的构造函数,我们不能这样新建一个SqlTrancaction类型的变量。在事务处理之前确实需要有一个SqlTransaction类型的变量,将该变量关联到SqlCommand类的Transcation属性也是必要的,但是初始化方法却比较特别一点。在初始化SqlTransaction类时,你需要使用SqlConnection类的BeginTranscation()方法:

SqlTransaction myTran; myTran=myConn.BeginTransaction();

??该方法返回一个SqlTransaction类型的变量。在调用BeginTransaction()方法以后,所有基于该数据连接对象的SQL语句执行动作都将被认为是事务MyTran的一部分。同时,你也可以在该方法的参数中指定事务隔离级别和事务名称,如:

SqlTransaction myTran;
myTran=myConn.BeginTransaction(IsolationLevel.ReadCommitted,"SampleTransaction");

??关于隔离级别的概念我们将在随后的内容中探讨,在这里我们只需牢记一个事务是如何被启动,并且关联到特定的数据链接的。

??先不要急着去搞懂我们的事务都干了些什么,看到这一行:

myTran.Commit();

??是的,这就是事务的提交方式。该语句执行后,事务的所有数据库操作将生效,并且为数据库事务的持久性机制所保持--即使系统在这以后发生致命错误,该事务对数据库的影响也不会消失。

??对上面的程序做了修改之后我们可以得到如下代码(为了节约篇幅,重复之处已省略,请参照前文):

//DoTran.cs……}

file://执行事务处理
public void DoTran()
{
  file://建立连接并打开
  SqlConnection myConn=GetConn();
  myConn.Open();
  SqlCommand myComm=new SqlCommand();

  file://SqlTransaction myTran=new SqlTransaction();
  file://注意,SqlTransaction类无公开的构造函数

  SqlTransaction myTran;

  file://创建一个事务
  myTran=myConn.BeginTransaction();
  try
  {
   file://从此开始,基于该连接的数据操作都被认为是事务的一部分
   file://下面绑定连接和事务对象
   myComm.Connection=myConn;
   myComm.Transaction=myTran; file://定位到pubs数据库
   myComm.CommandText="USE pubs";
   myComm.ExecuteNonQuery();//更新数据
   file://将所有的计算机类图书
   myComm.CommandText="UPDATE roysched SET royalty = royalty * 1.10 WHERE title_id LIKE 'Pc%'";
   myComm.ExecuteNonQuery();

   file://提交事务
   myTran.Commit();
  }
  catch(Exception err)
  {
   throw new ApplicationException("事务操作出错,系统信息:"+err.Message);
  }
  finally
  {
   myConn.Close();
  }
}
……

??到此为止,我们仅仅掌握了如何开始和提交事务。下一步我们必须考虑的是在事务中可以干什么和不可以干什么。[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8781179/viewspace-924588/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/8781179/viewspace-924588/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值