剖析概括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方法。
事务的作用域限于该连接。以下示例执行显式事务,该事务由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方法执行之前连接关闭或断开,事务将回滚。