产业经济 2024-04-25 20:54

快照隔离(snapshot isolation,SI)是数据库事务处理中的一个隔离级别,保证事务的读操作将看到一个一致的数据库的版本快照(实际上读取比该事务早的最后一次提交值)。该事务的写操作成功提交,仅当基于该快照的任何并发修改与该事务的修改没有冲突(即写-写冲突)。

很多重要的数据库管理系统已经采用了快照隔离,如Interbase, Firebird, Oracle, MySQL, PostgreSQL, SQL Anywhere, MongoDB 与 Microsoft SQL Server (从2005)。原因是快照隔离比可串行性隔离级别的性能更好,且能避免绝大多数并发异常。快照隔离一般用多版本并发控制(MVCC)实现。 快照隔离避免了ISO SQL-92所列举的并发异常现象,但不是SQL-92定义的无并发异常的可串行化。

定义

事务在启动时得到一个数据库的版本号。事务结束时,成功提交仅当它修改的快照的数据项此时没有被外界改变,即没有写-写冲突,否则事务流产(abort)。

写偏斜(write skew)异常,是指两个事务(T1与T2)并发读取一个数据集(例如包含 V1 与 V2),然后各自修改数据集中不相交的数据项(例如 T1 修改 V1, T2 修改 V2),最后并发提交事务。如果事务是串行执行,这种异常不会发生。而快照隔离允许这种异常发生。例如,设想 V1 与 V2是 Phil的个人银行账户。银行允许V1或V2是空头账户,只要两个账户总和非负(即 V1 + V2 ≥ 0). 两个户头的初值各是 $100. Phil启动两个事务,T1从V1取出$200,T2从V2取出$200。

解决写偏移异常的两种策略:

  • 实现写写冲突:增加要给专门的冲突表,两个事务都修改它。
  • 提升:一个事务修改它的只读数据行(替换其值为一个相等的值)从而导致一个写-写冲突,或者使用等价的提升:SELECT FOR UPDATE语句。

在上述例子中,可以重建一个表,记录每个储户与其总金额。但这种方法违背了数据库范式。另一种方式把一个事务的读数据提升为写数据,如T2做V1 = V1。但这种操作不总是可能的。

历史

快照隔离源自多版本并发控制数据库。 Interbase(后来被Borland所有),从1985年版本4开始提供了不是真正的可串行化的SI,并带有写偏移异常。

ANSI SQL-92标准基于数据库锁机制,对MVCC系统缺乏认识。

2008年Cahill等人的论文指出写偏斜异常可通过检测并流产危险的并发任务群解决。已经被PostgreSQL 9.1采用 这被称作"Serializable Snapshot Isolation", SSI.

2011, Jimenez-Peris等人申报专利可以解决每秒上千万次事务提交的快照隔离,成为超大规模并发数据库引擎LeanXcale的基础 . 2010成为Cumulonimbo European Project的部分 .