今天在有个事牵扯到事务,顺便研究了下,嘿,在学校还真的没学全,现在简单补充一下了。
首先,要说的事务的特性:acid
ACID (atomicity, consistency, isolation, and durability)
原子性,一致性,不相关性和持久性
ACID是一种缩写,它代表了操作(也称为操作管理器)的四个主要性质:
原子性:在一个操作中涉及两个或两个以上独立的信息,这些信息要么全部提交,要么一个也不提交。
一致性:操作要么创建新的有效的数据状态,要么(如果发生任何错误的话),将所有数据返回到初始状态。
不相关性:操作在没有提交并不与别的任何操作发生任何关系。
持久性:即使发生错误重新启动,保存过的已经提交的数据在正确状态下仍然有效。
在事务处理中,有2种方式,一种为手动事务,一种为自动事务。
手动事务允许显式处理若干过程,这些过程包括:开始事务、控制事务边界内的每个连接和资源登记、确定事务结果(提交或中止)以及结束事务。尽管此模型提供了对事务的标准控制,但它缺少一些内置于自动事务模型的简化操作。例如,在手动事务中数据存储区之间没有自动登记和协调。此外,与自动事务不同,手动事务中事务不在对象间流动。
如果选择手动控制分布式事务,则必须管理恢复、并发、安全性和完整性。也就是说,必须应用维护与事务处理关联的 ACID 属性所需的所有编程方法。
自动事务:
ASP.NET 页、XML Web services 方法或 .NET Framework 类一旦被标记为参与事务,它们将自动在事务范围内执行。您可以通过在页、XML Web services 方法或类中设置一个事务属性值来控制对象的事务行为。特性值反过来确定实例化对象的事务性行为。因此,根据声明特性值的不同,对象将自动参与现有事务或正在进行的事务、成为新事务的根或者根本不参与事务。声明事务属性的语法在 .NET Framework 类、ASP.NET 页和 XML Web services 方法中稍有不同。
声明性事务特性指定对象如何参与事务和如何以编程方式被配置。尽管此声明性级别表示事务的逻辑,但它是一个已从物理事务中移除的步骤。物理事务在事务性对象访问数据库或消息队列这样的数据资源时发生。与对象关联的事务自动流向合适的资源管理器。诸如 OLE DB、开放式数据库连接 (ODBC) 或 ActiveX 数据对象 (ADO) 的关联驱动程序在对象的上下文中查找事务,并通过分布式事务处理协调器 (DTC) 在此事务中登记。整个物理事务自动发生。
2种事务的对比:
尽管自动化事务处理模型极大地简化了分布式事务处理过程,但两种模型都用于执行本地事务处理(即对单个资源管理器如SQL Server 2000执行的事务处理)或分布式事务处理(即,对位于远程计算机上的多个资源管理执行的事务处理)。
你也许会试图利用自动化(COM+)事务处理来从易于编程的模型中获益。在有多个组件执行数据库更新的系统中,这种优点更明显。然而,在很多情况下,应当避免这种事务处理模型所带来的额外开销和性能损失。
在选择事务处理模型前,首先应当考虑是否真正需要事务处理。事务处理是服务器应用程序使用的最昂贵的资源,在不必要使用的地方,它们降低了扩展性。考虑下面用于管理事务处理使用的准则:
- 只在需要跨一组操作获取锁并需要加强ACID规则时才执行事务处理。
- 尽可能短地保持事务处理,以最小化维持数据库锁的时间。
- 永远不要将客户放到事务处理生命周期的控制之中。
- 不要为单个SQL语句使用事务处理。SQL Server自动把每个语句作为单个事务处理执行。
自动化事务处理与手工事务处理的对比
尽管编程模型已经对自动化事务处理进行了简化,特别是在多个组件执行数据库更新时,但本地事务处理总是相当快,因为它们不需要与微软DTC交互。即使你对单个本地资源管理器(如SQL Server)使用自动化事务处理,也是这种情况(尽管性能损失减少了),因为手式本地事务处理避免了所有不必要的与DTC的进程间通信。
对于下面的情况,需使用手工事务处理:
- 对单个数据库执行事务处理。
对于下列情况,则宜使用自动事务处理:
- 需要将单个事务处理扩展到多个远程数据库时。
- 需要单个事务处理拥有多个资源管理器(如数据库和Windows 2000消息队列(被称为MSMQ)资源管理器)时。
注意 避免混用事务处理模型。最好只使用其中一个。
下篇文章,将介绍手动事务示例。。。。