ADO.NET提供了处理后台数据所需要的一切功能,并且使用起来就如同从一张表格中读取一个数据那样简单。事务处理(transaction)允许你把数据库操作归为一组,由此来保证所有的操作都能够执行。因为一旦其中的一项操作执行失败,则整个事务处理都会失败。现在让我们来看看在.NET Framework下是如何使用事务处理的。 事务处理概况 使用这样的方法可能导致向两个极端情况发展:要么在事务处理中的所有操作都得到执行,要么没有任何操作得到执行。这样的方法对于实时应用程序来说非常必要。 银行业务是一个范例。事务处理应当包括从一个帐户到另一帐户的转帐过程。这一过程属于事务处理,原因是从某帐户中支出和在另一帐户存入两个动作必须被作为一个整体来执行——任何一方都不允许失败。在深入研究ADO.NET编程之前,让我们先来看看在SQL中是如何进行事务处理的。 SQL事务处理 Begin Transaction (启动事务处理) Commit Transaction (提交事务处理) 在两条声明中的所有语句都成为事务处理的一部分。命令Begin Transaction位于整个事务处理的起始位置,因此其后的所有命令只有在执行到命令Commit Transaction时才会被一并执行。ADO.NET方法就这么简单。 ADO.NET事务处理 System.Data.SqlClient namespace包括了SqlTransaction类。此类包括了两个属性: Connection:指示同事务处理相关联的SqlConnection对象; IsolationLevel:定义事务处理的IsolationLevel。 属性IsolationLevel是包括如下成员的枚举对象: Chaos:从高度独立的事务处理中出现的pending changes不能被覆盖; ReadCommitted:当数据需要被非恶意读取时,采用共享锁定(shared locks),但数据仍然可以在事务处理结束时被更新,这造成了非重复性的数据读取(nonrepeatable reads)或phantom data的产生; ReadUncommitted:恶意读取数据是可能发生的,这表示没有使用共享锁定(shared locks),并且没有实现独占锁定(exclusive locks); RepeatableRead:锁定查询中所用到的所有数据,由此避免其他用户对数据进行更新。在phantom rows仍然可用的状态下,这可以避免非重复性的数据读取(nonrepeatable reads); Serialisable:在DataSet中进行范围锁定,由此防止其他用户在事务处理结束之前更新数据或在数据库中插入行; IsolationLevel定义锁定记录的级别,但这一概念不在本文论述范围之内。对象SqlTransaction也提供了类似的方法。你可以使用以下方法来进行事务处理: Commit:提交数据库事务处理; Rollback:从未决状态(pending state)反转(roll back)事务处理。事务处理一旦被提交后即不能执行此操作; Save:在事务处理中创建savepoint可以对事务处理的一部分进行反转,并且指定savepoint名称。 以下的C#示例将这些部分综合起来。 这一简单的控制台程序将通过以下步骤将两行插入到Northwind数据库的表格中: 调用Connection对象的BeginTransaction方法以标记事务处理的起始位置。BeginTransaction方法对事务处理返回了一个坐标(reference),此坐标被指定给事务处理所用到的Command对象。 将Transaction对象指定给将要执行的Command的Transaction属性。如果某Command在活动Transaction中的Connection上被执行,并且Transaction对象还没有被指定到Command的Transaction属性,则会产生一个异常。 调用Transaction对象的Commit方法来结束事务处理,或者调用Rollback方法来取消事务处理。 等价的VB.NET代码与之类似。 事务处理结束 |
温馨提示:喜欢本站的话,请收藏一下本站!