李天平的博客


天道酬勤
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

.NET开发中的事务处理大比拼 之 ADO.NET级别的事务

Posted on 2009-06-17 20:44  李天平  阅读(2394)  评论(0编辑  收藏  举报

现在我们对事务的概念和原理都有所了解了,并且作为已经有一些基础的C#开发者,我们已经熟知编写数据库交互程序的一些要点,即:

1)使用SqlConnection类的对象的Open()方法建立与数据库服务器的连接。

2)然后将该连接赋给SqlCommand对象的Connection属性。

3)将欲执行的SQL语句赋给SqlCommandCommandText属性。

4)通过SqlCommand对象进行数据库操作。

创建一个ADO.NET事务是很简单的,需要定义一个SqlTransaction类型的对象。SqlConnection OleDbConnection对象都有一个 BeginTransaction 方法,它可以返回 SqlTransaction 或者OleDbTransaction 对象。然后赋给SqlCommand对象的Transcation属性,即实现了二者的关联。为了使事务处理可以成功完成,必须调用SqlTransaction对象的Commit()方法。如果有错误,则必须调用Rollback()方法撤销所有的操作。

代码示例:

基于以上认识,下面我们就开始动手写一个基于ADO.NET的事务处理程序。

                                            (示例位置:光盘\code\ch05\04\Web\WebForm2

string conString = "data source=127.0.0.1;database=codematic;user id=sa;

password=";

SqlConnection myConnection = new SqlConnection(conString);

myConnection.Open();

 

//启动一个事务

SqlTransaction myTrans = myConnection.BeginTransaction();

 

//为事务创建一个命令

SqlCommand myCommand = new SqlCommand();

myCommand.Connection = myConnection;

myCommand.Transaction = myTrans;

try

{

    myCommand.CommandText = "update P_Product set Name='电脑2' where Id=52";

    myCommand.ExecuteNonQuery();

    myCommand.CommandText = "update P_Product set Name='电脑3' where Id=53";

    myCommand.ExecuteNonQuery();

    myTrans.Commit();//提交

    Response.Write("两条数据更新成功");

}

catch (Exception ex)

{

    myTrans.Rollback();//遇到错误,回滚

    Response.Write(ex.ToString());              

}

finally

{

    myConnection.Close();

}

ADO.NET事务的优势和限制如下。

优势:

l  简单。

l  和数据库事务差不多快。

l  事务可以跨越多个数据库访问。

l  独立于数据库,不同数据库的专有代码被隐藏了。

限制:事务执行在数据库连接层上,所以需要在执行事务的过程中手动地维护一个连接。

 

所有命令都必须关联在同一个连接实例上,ADO.NET事务处理不支持跨多个连接的事务处理

 

      选自《亮剑.NET. .NET深入体验与实战精要》一书 5.4 节。