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