除了ACID属性,你知道事务的状态吗?| SQL全面教程八:事务(4)事务的ACID属性和执行状态| 8月更文挑战

1,302 阅读5分钟

事务执行是一系列数据库对象的读写操作。主要操作过程是,(读)从硬盘读取数据到主内存,然后复制值到程序变量;(写)修改内存中复制的对象,然后将其写入到硬盘。

DBMS的事务具有原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)四种特性。通常将这四种特性的首字母结合起来,统称为ACID特性

ACID特性或属性(Properties)

DBMS的事务必须遵循四个特性,即ACID特性。借助这四个属性,实现在并发访问和系统故障的情况下,可以维护数据的正确。

DBMS transactions must be atomic, consistent, isolated and durable

DBMS 事务必须是原子的、一致的、隔离的和持久的

原子性(Atomicity)

原子性是指在事务结束时,其中所包含的更新处理要么全部执行,要么完全不执行,也就是要么占有一切要么一无所有。

The 'all or nothing' property。一个事务是一个独立的整体。

事务结束时,事务内的语句要么全部执行(commit),数据更改;要么全部未执行(rollback),恢复到事务执行前的状态

一致性(Consistency)

一致性指的是事务中包含的处理要满足数据的完整性约束,比如数据库提前设置的约束,如主键约束或者NOT NULL约束等,还有数据值的一致性,操作前后保证数据的一致。

The 'No violation of integrity constraints' property. 不违反完整性约束。

A transaction must alter the database from one steady-state to another steady state。

事务对数据库的修改必须是从一个稳定状态到另一个稳定状态。

一致性也称为完整性。保持一致性是数据库和开发人员共同的责任,尤其是开发人员要确保其编写的事务,作为独立事务的一致性。

此处的一致性,除了数据库完整性约束自身的限制外,通常还会分出数据或数据值的一致性,严格上是逻辑一致性,保证逻辑操作的一致。其实最终都是保证数据库处于稳定状态,值不一致(数据错误)、违反完整性都是处于不稳定、不正确的状态。

隔离性(Isolation)

隔离性指的是保证不同事务之间互不干扰的特性。它保证了事务之间不会互相嵌套(指相互重叠影响)。

此外,在某个事务中进行的更改,在该事务结束之前,对其他事务而言是不可见的。因此,即使某个事务向表中添加了记录,在没有提交之前,其他事务也是看不到新添加的记录的。

The 'concurrent changes invisible' property. 并发改变不可见。

也就是事务要做到各自是独立执行的。如果多个事务同时执行,结果必须和它们以某种顺序连续执行一样。在第一个事务完成之前,第二个事务不能使用在第一个事务执行期间使用的数据。

各个事务不能相互干扰。对每个事务而言,都好像不存在其他的并发执行的事务。

隔离性是并发控制(concurrency control)要做到的。一个并发的事务看到的数据和状态,要么是另一个事务执行之前的,要么是另一个事务修改之后的,事务不会识别中间状态的数据。这就是可串行读。

并发执行事务的问题,一个解决方案就是上面提到的,串行(serially)执行。实际上DBMS的并发处理更复杂,详细可看之后的并发控制一节。

持久性(Durability)

持久性指的是在事务结束后(不论是提交还是回滚),DBMS能够保证该时间点的数据状态会被保存的特性。也就是事务完成后的数据和状态,是会永久保留和保存下来的,即使出现故障。

即使由于系统故障导致数据丢失,数据库也一定能通过某种手段进行恢复。也可以称为耐久性。

The 'committed update persist' property. 提交的更新持久化。保证事务结束后的数据或结果永远不会丢失。

The effects of an accomplished transaction are permanently recorded in the database and must not get lost or vanished due to subsequent failure.

确保持久性是数据库系统中recovery-management组件或recovery子系统的责任。

保持持久性的方法最常见的就是,将事务的执行记录保存到硬盘等存储介质中(该执行记录称为日志,或事务日志)。当发生故障时,可以通过事务日志恢复到故障发生前的状态。


作为不可分割的最小逻辑单元都要有这四个特性。所有的DBMS都必须遵守。

事务的状态:Active、Partially committed、Failed、Committed/Aborted

本部分主要参考自What is Transaction in DBMS? Explain Process,States and Properties of Transaction.

一个事务必须处于下面的状态之一:

  • Active:初始化状态,事务在执行时保持在该状态。
  • Partially committed:执行完最后一条语句之后。
  • Failed:当正常执行无法继续进行时。
  • Aborted:在事务回滚并且数据库恢复到事务开始前的状态之后。
  • Committed:成功完成后。

如下,为事务的各状态:

通常,事务已经提交表示整个事务是提交装态;事务中止(中断)或放弃表示整个事务是中止(中断)状态;事务终止(结束-complete)是事务被提交或中断。

事务开始,处于活动状态(Active)。当完成最后的语句时,进入部分提交状态(Partially committed),此时,事务已完成执行,但仍有可能不得不中止,因为实际输出可能仍暂时隐藏在主内存中,若有硬件故障可能会阻止其成功完成。

然后数据库系统将足够的信息写入磁盘,即使发生故障,当系统在故障后重新启动时,事务执行的更新也可以重新创建。当最后一条信息被写出时,事务进入提交状态(committed)。