SQL server中事务的四个属性特征(ACID)

时间:2023-11-11 23:40:20

事务的概念、类型和四个特征(ACID).


1.事务(Transaction)是并发控制的单位,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。 
通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性。


2.事务通常是以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK结束。

    COMMIT表示提交,即提交事务的所有操作。具体地说就是将事务中所有对数据库的更新写回到磁盘上的物理数据库中去,事务正常结束。

    ROLLBACK表示回滚,即在事务运行的过程中发生了某种故障,事务不能继续进行,系统将事务中对数据库的所有以完成的操作全部撤消,滚回到事务开始的状态。

3.事务类型

    A:手动事务
手动事务允许显式处理若干过程,这些过程包括:开始事务、控制事务边界内的每个连接和资源登记、确定事务结果(提交或中止)以及结束事务。
尽管此模型提供了对事务的标准控制,但它缺少一些内置于自动事务模型的简化操作。例如,在手动事务中数据存储区之间没有自动登记和协调。
此外,与自动事务不同,手动事务中事务不在对象间流动。
如果选择手动控制分布式事务,则必须管理恢复、并发、安全性和完整性。也就是说,必须应用维护与事务处理关联的 ACID 属性所需的所有编程方法。 B:自动事务
.NET 页、XML Web services方法或 .NET Framework 类一旦被标记为参与事务,它们将自动在事务范围内执行。
您可以通过在页、XML Web services 方法或类中设置一个事务属性值来控制对象的事务行为。特性值反过来确定实例化对象的事务性行为。
因此,根据声明特性值的不同,对象将自动参与现有事务或正在进行的事务,成为新事务的根或者根本不参与事务。
声明事务属性的语法在 .NET Framework 类、.NET 页和 XML Web services 方法中稍有不同。
声明性事务特性指定对象如何参与事务,如何以编程方式被配置。
尽管此声明性级别表示事务的逻辑,但它是一个已从物理事务中移除的步骤。
物理事务在事务性对象访问数据库或消息队列这样的数据资源时发生。
与对象关联的事务自动流向合适的资源管理器,诸如 OLE DB、开放式数据库连接 (ODBC) 或 ActiveX 数据对象 (ADO) 的关联驱动程序在对象的上下文中查找事务,
并通过分布式事务处理协调器 (DTC) 在此事务中登记。整个物理事务自动发生。

4.事务的特性(ACID特性)

    A:原子性(Atomicity)
事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做。
事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。 B:一致性(Consistency)
事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
一个事务可以封装状态改变(除非它是一个只读的)。事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少。
也就是说:如果事务是并发多个,系统也必须如同串行事务一样操作。其主要特征是保护性和不变性(Preserving an Invariant).
以转账案例为例,假设有五个账户,每个账户余额是100元,那么五个账户总额是500元,如果在这个5个账户之间同时发生多个转账,无论并发多少个,
比如在A与B账户之间转账5元,在C与D账户之间转账10元,在B与E之间转账15元,五个账户总额也应该还是500元,这就是保护性和不变性. C:隔离性(Isolation)
一个事务的执行不能被其他事务干扰。隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,
执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,
必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。 D:持续性/永久性(Durability)
一个事务一旦提交,它对数据库中数据的改变就应该是永久性的,不会被回滚。

5.例子:

    A:比如说在网上转帐从A账户往B账户转100元,需要执行两个操作A账户减少100元,B账户增加100元。
这两个操作如果只执行了第一个操作,那么你是不会答应的,因为你损失了100元,而如果只执行了第二个操作,那么银行也不会答应。
这两个操作要么都同时执行成功,要么都执行失败,否则一个成功,一个失败都是不合理的。
因此将这两个操作放在一个事务中去执行,事务的原子性,保证了要么都执行,要么都不执行。 B:一致性的话,再举个例子,比如说你刷卡买电影票,步骤是这样的,首先营业员先给你打出一张票,然后你刷卡,拿电影票。
这个时候,实际的电影票是资源,而数据库中的电影票是数据。营业员如果帮你打出一张票,这个时候,数据库中电影票实际上数目减一了,
但是如果你刷卡失败了,实际的电影票资源并没有发生改变,这个时候执行回滚操作,恢复到打票之前的数据。这样保证了资源和数据的一致性。 C:隔离性的话,就是两个事务之间的操作相互之间不会影响,即不会发生脏读、不可重复读和幻象。 D:持久性的话比较好理解,就是事务执行成功以后,数据将保存在数据库中不再发生改变。