电脑爱好者,提供IT资讯信息及各类编程知识文章介绍,欢迎大家来本站学习电脑知识。 最近更新 | 联系我们 RSS订阅本站最新文章
电脑爱好者
站内搜索: 
当前位置:首页>> C#>>事务的开启和提交:

事务的开启和提交

来源:网络 | 2007-6-24 | (有4565人读过)

现在我们对事务的概念和原理都了然于心了,并且作为已经有一些基础的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(); 
  } 

……  

到此为止,我们仅仅掌握了如何开始和提交事务。下一步我们必须考虑的是在事务中可以干什么和不可以干什么。
C#热门文章排行
网站赞助商
购买此位置

 

关于我们 | 网站地图 | 文档一览 | 友情链接| 联系我们

Copyright © 2003-2024 电脑爱好者 版权所有 备案号:鲁ICP备09059398号