技术开发 频道

理解.NET 2.0中的事务


【IT168 专稿】 

    事实上,所有的商业应用程序都需要不同层次的事务支持。利用关系型数据库提供的架构规则,在很大程度上能够在静态视图中显示完整数据。然而,在动态过程中,事务能够在持久化过程结束时,确保应用或者不应用所有的变化。本文将重点介绍.NET 2.0技术提供的事务功能,首先介绍事务的概念和数据库事务,然后讲解.NET 2.0中的事务功能。 

1. 事务的概念


    为了理解.NET对事务的支持,很重要的是建立对事务的整体理解。事务能够确保实现,除非所有操作都成功完成,否则面对数据的资源不会持久化更新。事务由一组要么成功要么失败的操作定义。也就说,如果事务内的所有操作都成功完成,那么提交事务,同时持久化写入更新数据。然而,如果其中一个操作失败,则执行回滚,结果数据回到事务启动前的状态。举例而言,假设需要把100元从帐户A转到帐户B。该操作包括两个步骤:(1)从帐户A中扣除100元。(2)向帐户B添加100元。在发生成功完成步骤1,但是由于一些原因导致步骤2失败的情况下。如果不撤消还原步骤1,那么整个操作将发生错误。事务能够帮助以避免这种情况。如果所有步骤都执行成功,那么在相同事务中的操作将会修改数据库。在本例中,如果步骤2失败,则步骤导致的变化将不会提交给数据库。

    通常,事务遵循特定的规则,其称为ACID特性。ACID特性确保复杂事务是自包含和可信赖的。下面简单介绍一下这个特性。

    事务必须具有原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。将这四个特性的首字母组合起来就是ACID。虽然首字母缩写词容易记忆,但是每个词的含义不是很明显。以下是简要说明:

    原子性:原子性可确保要么执行所有更新,要么什么也不发生。由于事务中的原子性保障,开发人员不必编写代码来处理一个更新成功,而另一个没有成功的情况。

    一致性:一致性意味着事务的结果使得系统保持一致状态。在事务启动之前,数据保持有效的状态,这与事务结束时一样。一致性还确保了事务必须使得数据库保持一致状态,那么如果事务的部分操作失败,则其他部分也必须回到原来的状态。

    隔离性:多个用户可能同时访问同一个数据库。使用隔离性能够保证在事务完成之前,该事务外部不能看到事务中的数据改变。也不能访问一些中间状态,如果事务终止这些状态将不会发生。

    持久性:持久性意味着即使是系统崩溃也能够保证一致性状态。如果数据库系统崩溃,则持久性必须保证已经提交的事务确实写入了数据库。

2. 数据库事务

    在很多商业应用程序中经常使用事务,因为事务为系统带来了稳定性和可预测性。通常而言,当开发软件系统时,使用数据源存储数据。为了在这样的软件系统中应用事务的概念,数据源必须支持事务。现代数据库,例如Microsoft SQL Server 2005和Oracle 9i都大力支持事务。例如,SQL Server 2005提供了一些支持事务的T-SQL语句,例如BEGIN TRANSACTION、SAVE TRANSACTION、COMMIT TRANSACTION和ROLLBACK TRANSACTION。数据访问API,例如ODBC,OLE DB和ADO.NET,可使开发人员在应用程序中使用事务。通常,只要使用单个数据库,RDBMS和数据访问API都提供对事务的支持。在很多包括多个数据库的大型应用程序中,可能需要使用Microsoft分布式事务处理协调器(MSDTC)。COM+是一种流行的中间件产品,其在内部利用MSDTC来帮助实现多数据库事务,甚至是不同已知事务实体之间的事务,而通常将其作为资源管理器。应该注意的是,在.NET 2.0中,可以使用System.Transactions命名空间来设置分布式事务,以替代System.EnterpriseServices。

    事务分为本地事务和分布式事务两种类型。(1)本地事务:该类型事务使用已知数据源(例如SQL Server),同时还是单阶段事务。当单个数据库中保存了所有有关事务的数据,那么对自身可以强制使用ACID规则。这意味着在单个数据库服务器中(例如SQL Server),只要使用同一个连接,则可以跨数据库使用本地事务。(2)分布式事务:该类型事务使用多个已知事务数据源。分布式行为可能需要从消息队列服务器中读取消息,从SQL Server数据库中获取数据,以及将消息写入其他数据库。

    一些软件包(例如MSDTC)能够以编程方式辅助实现分布式事务,通过使用一些方法(例如两阶段提交和回滚)能够控制跨越所有数据源的提交和回滚行为,以便保证集成性。MSDTC仅可用于兼容事务管理接口的应用程序。当前可用的应用程序有MSMQ、SQL Server、Oracle、Sybase和其他当前可用的应用程序(称为资源管理器)。

    在分布式事务环境中,不同的资源管理器需要实现可靠的提交协议,最为常见的实现是两阶段提交。在两阶段提交中,实际的提交工作分为两个阶段:第一个阶段包括为提交准备一些所需的更改。这样,资源管理器就会与事务协调器通信,告知其更新准备已经就绪,准备执行提交,但实际还不进行提交。在第二个阶段中,一旦所有资源管理器都告知事务协调器准备工作就绪,那么事务协调器将使所有参与者都了解继续工作准备好,接着执行更改。在两阶段提交中,单个或者多个数据库能够参与分布式事务。实际上,任何在MSDTC事务中登记的对象都能够参与由MSDTC管理的分布式事务。例如,MSMQ能够参与由两个SqlConnection对象连接两个不同数据库的事务。
0
相关文章