返回

数据库事务隔离的历史进程:对标准化的持续探索

后端

1. 数据库事务隔离的的目标:确保一致性

1.1 保证ACID特性

事务隔离是数据库系统设计的根本组成部分,旨在保证事务的原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),即ACID特性。其中,隔离性要求事务彼此独立执行,不受其他事务的影响。

1.2 避免脏读、不可重复读、幻读

事务隔离级别正是为了防止脏读、不可重复读和幻读等问题而存在的。脏读是指一个事务读到了另一个尚未提交事务的数据;不可重复读是指一个事务多次读取同一数据,却得到了不同的结果,因为其他事务对该数据进行了修改;幻读是指一个事务读取数据时,发现其他事务插入了新的数据,导致读取结果与预期不符。

2. 否定之否定:隔离级别的演进

2.1 ANSI SQL-89:最早的标准化尝试

1989年,美国国家标准协会(ANSI)颁布了SQL-89标准,其中对事务隔离级别进行了首次标准化。SQL-89定义了四个隔离级别:

  • 未提交读(READ UNCOMMITTED): 事务可以读取其他事务未提交的数据,也可能读取到脏数据。
  • 已提交读(READ COMMITTED): 事务只能读取其他事务已提交的数据,避免了脏读问题。
  • 可重复读(REPEATABLE READ): 事务只能读取自己事务开始时的数据,避免了不可重复读问题。
  • 串行化(SERIALIZABLE): 事务按顺序执行,完全避免了并发问题。

2.2 Oracle:商业数据库的创新

在SQL-89标准的基础上,Oracle数据库引入了新的隔离级别:

  • 快照隔离(SNAPSHOT ISOLATION): 事务只能读取自己事务开始时的数据,以及其他事务已提交的数据。

快照隔离解决了可重复读隔离级别下幻读的问题,但会带来性能开销。

2.3 ANSI SQL-92:标准化的完善

1992年,ANSI发布了SQL-92标准,对SQL-89进行了修订,并增加了新的隔离级别:

  • 读已提交(READ COMMITTED): 事务只能读取其他事务已提交的数据,但允许幻读。

读已提交隔离级别介于已提交读和可重复读之间,提供了较好的性能和隔离性平衡。

2.4 PostgreSQL:开源数据库的挑战

PostgreSQL数据库对SQL-92标准进行了扩展,引入了新的隔离级别:

  • 串行可重复读(SERIALIZABLE REPEATABLE READ): 事务按顺序执行,但允许幻读。

串行可重复读隔离级别提供了比串行化隔离级别更强的隔离性,但会带来更高的性能开销。

2.5 Microsoft SQL Server:商业数据库的追赶

Microsoft SQL Server数据库也对SQL-92标准进行了扩展,引入了新的隔离级别:

  • 快照隔离(SNAPSHOT ISOLATION): 事务只能读取自己事务开始时的数据,以及其他事务已提交的数据。

快照隔离级别与Oracle数据库的快照隔离级别类似,但SQL Server还允许在快照隔离级别下使用游标。

3. Adya的隔离级别定义:更合理的划分

2000年,Adya提出了一个更合理的隔离级别定义:

  • 未提交读(READ UNCOMMITTED): 事务可以读取其他事务未提交的数据,也可能读取到脏数据。
  • 已提交读(READ COMMITTED): 事务只能读取其他事务已提交的数据,但允许幻读。
  • 可重复读(REPEATABLE READ): 事务只能读取自己事务开始时的数据,但允许不可重复读。
  • 串行化(SERIALIZABLE): 事务按顺序执行,完全避免了并发问题。

Adya的隔离级别定义与ANSI SQL-92标准的定义非常相似,但对可重复读隔离级别的定义进行了修改,允许不可重复读。这种修改使得可重复读隔离级别更加实用,因为在实际应用中,不可重复读的情况并不常见。

4. 结语

数据库事务隔离是数据库系统设计中的一个重要概念,对数据库的并发性和一致性有着至关重要的影响。随着数据库技术的发展,事务隔离级别也经历了从无到有、从不完善到完善的演变过程。Adya提出的隔离级别定义是目前为止最合理、最实用的定义,为数据库系统的设计和实现提供了有力的指导。