剖析概括ADO.NET执行事务

开发 后端
这里就使用单个连接ADO.NET执行事务、ADO.NET执行事务步骤、确定事务类型做出详细的介绍,希望对大家有帮助。

事务往往是我们很难处理的一部分,这里结合我的经验和大家来谈谈关于ADO.NET执行事务。如果要将多项任务绑定在一起,使其作为单个工作单元来执行,可以使用ADO.NET中的事务。例如,假设应用程序执行两项任务。首先使用订单信息更新表。然后更新包含库存信息的表,将已订购的商品记入借方。如果任何一项任务失败,两个更新均将回滚。

确定事务类型

事务如果是单阶段事务,并且由数据库直接处理,则属于本地事务。事务如果由事务监视程序进行协调并使用故障保护机制(例如两阶段提交)解决事务,则属于分布式事务。每个.NETFramework数据提供程序使用自己的Transaction对象来执行本地事务。如果要求在SQLServer数据库中执行,请选择System.Data.SqlClient事务。对于Oracle事务,使用System.Data.OracleClient提供程序。此外,还提供了一个新的DbTransaction类,用于编写需要事务并且与提供程序无关的代码。

在服务器上执行时,事务最有效。如果使用的SQLServer数据库广泛使用显式事务,应考虑使用Transact-SQLBEGINTRANSACTION语句以存储过程的形式编写这些事务。有关执行服务器端事务的更多信息,请参见“SQLServer联机图书”。

使用单个连接ADO.NET执行事务

在ADO.NET中,使用Connection对象控制事务。可以使用BeginTransaction方法启动本地事务。开始事务后,可以使用Command对象的Transaction属性在该事务中登记一个命令。然后,可以根据事务组件的成功或失败,提交或回滚在数据源上进行的修改。不应对本地事务使用EnlistDistributedTransaction方法。

#T#事务的作用域限于该连接。以下示例执行显式事务,该事务由try块中两个独立的命令组成。这两个命令对AdventureWorksSQLServer2005示例数据库的Production.ScrapReason表执行INSERT语句,如果没有引发异常,则提交。如果引发异常,catch块中的代码将回滚事务。如果在事务完成之前事务中止或连接关闭,事务将自动回滚。

按照下列步骤ADO.NET执行事务。
1.调用SqlConnection对象的BeginTransaction方法,以标记事务的开始。BeginTransaction方法返回对事务的引用。此引用分配给在事务中登记的SqlCommand对象。
2.将Transaction对象分配给要执行的SqlCommand的Transaction属性。如果在具有活动事务的连接上执行命令,并且尚未将Transaction对象配给Command对象的Transaction属性,则会引发异常。
3.执行所需的命令。
4.调用SqlTransaction对象的Commit方法完成事务,或调用Rollback方法结束事务。如果在Commit或Rollback方法执行之前连接关闭或断开,事务将回滚。

以下代码示例演示对MicrosoftSQLServer使用ADO.NET的事务逻辑。

  1. UsingconnectionAsNewSqlConnection(connectionString)  
  2. connection.Open()  
  3.  
  4. 'Startalocaltransaction.  
  5. DimsqlTranAsSqlTransaction=connection.BeginTransaction()  
  6.  
  7. 'Enlistacommandinthecurrenttransaction.  
  8. DimcommandAsSqlCommand=connection.CreateCommand()  
  9. command.Transaction=sqlTran 
  10.  
  11. Try  
  12. 'Executetwoseparatecommands.  
  13. command.CommandText=_ 
  14. "INSERTINTOProduction.ScrapReason(Name)VALUES('Wrongsize')"  
  15. command.ExecuteNonQuery()  
  16. command.CommandText=_ 
  17. "INSERTINTOProduction.ScrapReason(Name)VALUES('Wrongcolor')"  
  18. command.ExecuteNonQuery()  
  19.  
  20. 'Committhetransaction  
  21. sqlTran.Commit()  
  22. Console.WriteLine("Bothrecordswerewrittentodatabase.")  
  23.  
  24. CatchexAsException  
  25. 'Handletheexceptionifthetransactionfailstocommit.  
  26. Console.WriteLine(ex.Message)  
  27.  
  28. Try  
  29. 'Attempttorollbackthetransaction.  
  30. sqlTran.Rollback()  
  31.  
  32. CatchexRollbackAsException  
  33. 'ThrowsanInvalidOperationExceptioniftheconnection  
  34. 'isclosedorthetransactionhasalreadybeenrolled  
  35. 'backontheserver.  
  36. Console.WriteLine(exRollback.Message)  
  37. EndTry  
  38. EndTry  
  39. EndUsing  

 

 

 

 

责任编辑:田树 来源: 博客
相关推荐

2009-11-12 16:04:42

ADO.NET对象查询

2009-11-12 11:17:13

2009-11-12 10:15:37

ADO.NET使用

2009-11-04 11:40:38

ADO.NET Dat

2009-11-12 10:45:45

ADO.NET连接测试

2009-11-04 17:03:55

ADO.NET Exc

2009-11-13 13:35:54

ADO.NET数据服务

2009-12-21 11:18:09

ADO.NET体系结构

2009-12-23 16:05:47

ADO.NET错误

2009-12-28 15:32:04

ADO.NET构造

2009-12-30 16:58:43

ADO.NET

2009-11-13 13:11:37

ADO.NET连接池

2009-12-24 16:09:42

ADO.NET数据源

2009-12-30 16:50:26

ADO.NET事务

2010-01-04 13:06:50

ADO.NET事务

2009-12-30 10:02:37

ADO.NET Ent

2009-11-13 17:01:07

ADO.NET事务处理

2009-12-29 14:55:31

ADO.NET Dat

2009-11-12 14:32:21

ADO.NET分布式事

2009-12-28 15:11:36

ADO.NET专家
点赞
收藏

51CTO技术栈公众号