事务的处理

本文深入探讨了事务处理的激活、准备和提交三个阶段,以及ACID(原子性、一致性、隔离性和持久性)四大特性。介绍了在数据库、内存对象甚至文件系统和注册表中应用事务的可能性。同时,提到了System.Transactions命名空间如何简化事务处理,支持本地和可升级的事务,以及环境事务的概念,使得在.NET环境中事务处理更加便捷。

事务的主要特征是,任务要么全部完成,要么都不完成。在写入一些记录时,要么写入所有记录,要么什么都不写入。在写入一个记录时即使出现了一次失败,在事务中已写入的所有其他数据也会回滚。事务常用于数据库,但利用System.Transactions名称空间中的类,还可以对不稳定的、基于内存的对象执行事务处理,如对象列表。对于支持事务的对象列表,如果添加或删除了一个对象时事务处理失败,这个列表的操作会自动撤销。写入一个基于内存的列表与写入数据库一样,也可以在事务中完成。自从Windows Vista之后,文件系统和注册表也支持事务。在注册表中写入一个文件,并做出一些修改的操作可以通过事务来完成。
事务处理阶段:
事务处理分为激活、准备和提交3个阶段。·激活阶段:在这个阶段创建事务。为资源管理事务处理的资源管理器可以用事务进行登记。.准备阶段:在这个阶段,每个资源管理器都可以定义事务的结果。事务的创建者发出结束事务的指令时,就启动这个阶段。事务管理器给所有的资源管理器发出一条“准备”消息。如果资源管理器可以成功生成事务的结果,就向事务管理器发出一条“已准备好”消息。如果资源管理器未能准备好,就可以终止事务处理,发出一条“回滚”消息,强制事务管理器执行回滚操作。在发出“已准备好”消息后,资源管理器必须保证在提交阶段能成功完成工作。为此,稳定的资源管理器必须将准备状态的信息写入一个日志中,这样,如果在准备和提交过程中出现停电等故障时,就可以从该状态继续执行。提交阶段:当所有的资源管理器都成功准备好了,就开始这个阶段。即所有资源管理器都发出了“已准备好”消息。接着,事务管理器就可以给所有的参与者发送一条“提交”消息,以完成工作。资源管理器现在可以完成事务中的工作,并返回一条“已提交”消息。
ACID属性:
事务有一些特殊的要求,例如,事务的结果必须处于有效的状态。即使服务器断电了,也需要有有效状态。事务的特征可以用术语ACID 来定义, ACID 是Atomicity, Consistency, IsolationDurability的首字母缩写。Atomicity(原子性):表示一个工作单元。在事务中,要么整个工作单元都成功完成,要么都不完成。Consistency(一致性):事务开始前的状态和事务完成后的状态必须有效。在执行事务的过程中,状态可以有临时值。Isolation(隔离性):表示并发进行的事务独立于状态,而状态在事务处理过程中可能发生变化。在事务未完成时,事务A看不到事务B中的临时状态。Durability(持久性):在事务完成后,它必须以可持久的方式存储起来。如果关闭电源或服务器崩溃,该状态在重新启动时必须恢复。并不是每个事务都需要这4个属性。例如,基于内存的事务(如将一项写入列表中)就不需要持久性。事务也不总是需要与外界隔离,如后面的事务隔离级别所述 ,传统的事务:在发布System.Transaction名称空间之前,可以直接用ADO.NET 创建事务,也可以通过组件、特性和COM+运行库(位于System.EnterpriseServices名称空间中)进行事务处理。如果有多条命令要运行在一个事务中,每条命令都必须与该事务关联起来。因为事务还与一个连接关联起来,所以这些命令也必须关联到同一个连接实例上。ADO.NET事务不支持跨多个连接的事务;它总是关联到一个连接上的本地事务。如果使用多个对象创建了一个对象持久性模型,例如, Course和CourseDate类应在一个事务处理中持续使用,就很难使用ADO.NET事务来实现。这需要把事务传递给参与同一个事务的所有对象。
事务处理的升级:
System.Transactions支持可升级的事务处理。根据参与事务处理的资源,创建本地事务或者分布式事务。SQL Server自从2005版本开始支持可升级的事务,但目前我们只看到本地事务。在前面的例子中,分布式事务ID总是设置为0,且只赋予了本地ID。对于不支持可升级的事务的资源,会创建分布式事务。如果把多个资源添加到事务中,事务就可以先设置为本地事务,再根据需要升级为分布式事务。当多个SQL Server数据库连接添加到事务中时,就会进行这种升级。事务开始时是一个本地事务,之后升级为分布式事务。
环境事务:System. Transactions的一大优点是环境事务功能。使用环境事务,就不需要手动用连接登记事务;在支持环境事务的资源中,这是自动实现的。环境事务与当前的线程关联起来。可以使用静态属性Transaction.Current获取和设置环境事务。支持环境事务的API会检查这个属性,以获得环境事务,用该事务登记。ADO.NET连接支持环境事务。可以创建一个CommittableTransaction对象,把它赋予Transaction.Current属性,以初始化环境事务。创建环境事务的另一种方式是使用TransactionScope类。TransactionScope类的构造函数会创建一个环境事务。TransactionScope类的重要方法有CompleteO)和DisposeO方法。Complete)方法可以设置事务的作用域的成功位。Dispose)方法完成该作用域,如果该作用域与根作用域相关,就提交或回滚事务。因为TransactionScope类实现IDisposable接口,所以可以用using语句定义事务的作用域。默认构造函数创建了–个新的事务,创建TransactionScope实例之后,用Transaction.Current属性的get访问器访问事务,以在控制台上显示事务信息。要获得事务何时完成的信息,就应为环境事务的TransactionCompleted事件设置OnTransactionCompleted()方法。然后,调用StudentData.AddStudentO方法,以新建一个Student对象,并把它写入数据库中。对于环境事务,不再需要给这个方法传递Transaction对象,因为SqlConnection类支持环境事务,并且会自动通过连接登记它。接着TransactionScope类的CompleteO方法设置成功位,在using语句的最后删除TransactionScope类,完成提交。如果没有调用Complete(方法, Dispose()就终止事务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值