# Snapshot Isolation

+ 事务只能看到早于它开始时刻之前提交的其他事务

![left](./student-guide/diagram/11-Snapshot-Isolation-01-01.png)
-------------------------------------------------------------
快照隔离级别 (Snapshot Isolation)

在早期的SQL标准中定义的四个事务隔离级别，只适用于基于锁的事务并发控制。

1995 年 Hal Berenson 等人发布了论文《 A Critique of ANSI SQL Isolation Levels》中提出了 Snapshot Isolation 的概念。该隔离级别不会出现脏读、不可重复读、狭义上的幻读 (A3)，但不会阻止广义上的幻读 (P3)，不会阻塞读操作，同时，SI 还会出现写偏斜，而 ANSI 可重复读隔离级别不会出现写偏斜，会出现幻读。对于读多写少的应用，Snapshot Isolation是非常好的选择。

在 Snapshot Isolation 事务隔离级别下，实际上规定的就是事务之间的可见行。对于Snapshot Isolation来说：事务只能看到早于它开始时刻之前提交的其他事务。
以下图为例：白色方框代表事务的开始时间，灰色方框代表事务的结束时间，每个事务都会读到事务开始时间的快照，因为事务开始时间是稳定的，所以事务看到的数据版本也是稳定的。事务2的开始时间在事务1结束时间之前，所以事务2看不到事务1的修改，事务3开始时间在事务1与实务2提交之后，所以事务3可以看到事务1和事务2的修改。

在写写方面，如果事务1和事务2是有数据重合的写操作，那么会导致写写冲突，至少有一个事务会被回滚，在 SI 的隔离级别下，对写写冲突的处理也比较简单。

