事实上,所有的商业应用程序都需要不同层次的事务支持。利用关系型数据库提供的架构规则,在很大程度上能够在静态视图中显示完整数据。然而,在动态过程中,事务能够在持久化过程结束时,确保应用或者不应用所有的变化。本文将重点介绍.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和 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.EnterpriseSer