隔离级别、SI 和 SSIACID隔离级别Snapshot IsolationSerializable Snapshot Isolation

本文是我对最近读的几篇论文的总结,没有太多引用原文,纯靠自己的理解和印象串联起来。主要是为日后深入了解相关知识做个简单“索引”。

本文描述得不是很严谨,也不保证完全正确,建议有兴趣的同学去阅读论文——根据论文名称搜索就可以找到。

ACID

事务是关系数据库操作的逻辑单位。 事务的存在,是为从数据库层面保证数据的安全性,减轻应用程序的负担

说起“事务”,总会先想起 “ACID” 四个字母。

  • A:Atomicity,原子性。
  • C:Consistency,一致性。
  • I:Isolation,隔离性。
  • D:Durability,持久性。

原子性、一致性和持久性都比较好理解。

一个事务可能包含一个或多个操作,原子性保证这些操作要么全部被生效,要么全部不被生效。 数据库的一致性是指数据库中的数据都满足“完整性约束”,如主键的唯一约束。

事务提交后,要永久保存到数据库中,这就是持久性。简单地说就是数据要落盘。为了提高系统的可用性,数据还应该通过某种算法复制到其它机器。

隔离性是这几个特性里面比较不好理解的。单个事务的场景下,谈隔离性是没意义的——事务之间有并发才有隔离的必要。简单地说,隔离性指的就是数据库在并发事务下的表现。权衡安全和性能,数据库一般会有多个隔离级别。

隔离级别

SQL 标准里定义了四个隔离级别:

  • 读未提交(Read Uncommitted):会出现脏读(Dirty Read)—— 一个事务会读到另一个事务的中间状态。
  • 读已提交(Read Committed):会出现不可重复读(Unrepeatable Read) —— 事务只会读到已提交的数据,但是一行数据读取两遍得到不同的结果。
  • 可重复读(Repeatable Read):会出现幻读(Phantom Read) —— 一个事务执行两个相同的查询语句,得到的是两个不同的结果集(数量不同)。
  • 可串行化(Serializable):可以找到一个事务串行执行的序列,其结果与事务并发执行的结果是一样的。

SQL 标准定义的的这四个隔离级别,只适用于基于锁的事务并发控制。后来有人写了一篇论文 A Critique of ANSI SQL Isolation Levels 来批判 SQL 标准对隔离级别的定义,并在论文里提到了一种新的隔离级别 —— 快照隔离(Snapshot Isolation,简称 SI)。

Snapshot Isolation

在 Snapshot Isolation 下,不会出现脏读、不可重复度和幻读三种读异常。并且读操作不会被阻塞,对于读多写少的应用 Snapshot Isolation 是非常好的选择。并且,在很多应用场景下,Snapshot Isolation 下的并发事务并不会导致数据异常。所以,主流数据库都实现了 Snapshot Isolation,比如 Oracle、SQL Server、PostgreSQL、TiDB、CockroachDB(关于 MySQL 的隔离级别,可以参考这篇文章)。

虽然大部分应用场景下,Snapshot Isolation 可以很好地运行,但是 Snapshot Isolation 依然没有达到可串行化的隔离级别,因为它会出现写偏序(write skew)。Write skew 本质上是并发事务之间出现了读写冲突(读写冲突不一定会导致 write skew,但是发生 write skew 时肯定有读写冲突),但是 Snapshot Isolation 在事务提交时只检查了写写冲突。

为了避免 write skew,应用程序必须根据具体的情况去做适配,比如使用SELECT ... FOR UPDATE,或者在应用层引入写写冲突。这样做相当于把数据库事务的一份工作扔给了应用层。

Serializable Snapshot Isolation

后来,又有人提出了基于 Snapshot Isolation 的可串行化 —— Serializable Snapshot Isolation,简称 SSI(PostgreSQL 和 CockroachDB 已经支持 SSI)。

为了分析 Snapshot Isolation 下的事务调度可串行化问题,有论文提出了一种叫做 Dependency Serialization Graph (DSG) 的方法(可以参考下面提到的论文,没有深究原始出处)。通过分析事务之间的 rw、wr、ww 依赖关系,可以形成一个有向图。如果图中无环,说明这种情况下的事务调度顺序是可串行化的。这个算法理论上很完美,但是有一个很致命的缺点,就是复杂度比较高,难以用于工业生产环境。

Weak Consistency: A Generalized Theory and Optimistic Implementations for Distributed Transactions 证明在 Snapshot Isolation 下, DSG 形成的环肯定有两条 rw-dependency 的边。

Making snapshot isolation serializable 再进一步证明,这两条 rw-dependency 的边是“连续”的(一进一出)。

后来,Serializable Isolation for snapshot database 在 Berkeley DB 的 Snapshot Isolation 之上,增加对事务 rw-dependency 的检测,当发现有两条“连续”的 rw-dependency 时,终止其中一个事务,以此避免出现不可串行化的可能。但是这个算法会有误判——不可以串行化的事务调用会出现两条“连续”的 rw-dependency 的边,但是出现两条“连续”的 rw-dependency 不一定会导致不可串行化。

Serializable Snapshot Isolation in PostgreSQL 描述了上述算法在 PostgreSQL 中的实现。

上面提到的 Berkeley DB 和 PostgreSQL 的 SSI 实现都是单机的存储。A Critique of Snapshot Isolation 描述了如何在分布式存储系统上实现 SSI,基本思想就是通过一个中心化的控制节点,对所有 rw-dependency 进行检查,有兴趣的可以参考论文。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏VMCloud

如何分析 WindowsDump:BSOD 分析与 WinDbg 使用(二)

当 Windows 出现异常 Crash 时 Windows 会调用 Dump 系统来形成一个转储文件(*.dmp),通过特殊工具可以进行分析。

5680
来自专栏虚拟化云计算

kvm虚拟机的FT(容错)方案

KVM中的FT(fault tolerance),也叫non-stop service。在有些场景下也被称为虚拟机热备。

4038
来自专栏啸天"s blog

tiny模式转OpenVPN教程

1483
来自专栏SDNLAB

SDN网络感知服务与最短路径应用

本文将介绍RYU中的网络感知服务,与基于网络服务的最短路径应用,主要内容包括网络资源感知模块,网络监控模块和基于网络信息的最短路由模块介绍。在一个真实的网络环境...

3328
来自专栏北京马哥教育

NoSQL之mongodb我见

NoSQL介绍: NoSQL数据管理系统是目前非常流行的一种非关系性、分布式、不支持ACID设计规范式的数据库;NoSQL简单的数据模型、元数据和数据分离、弱一...

2869
来自专栏Python中文社区

最新实用Python异步爬虫代理池(开源)

异步爬虫代理池,以 Python asyncio 为基础,旨在充分利用 Python 的异步性能。

951
来自专栏PHP技术

MySQL InnoDB四个事务级别 与 脏读、不重复读、幻读

MySQL InnoDB事务的隔离级别有四级,默认是“可重复读”(REPEATABLE READ)。 1).未提交读(READUNCOMMIT...

4316
来自专栏PingCAP的专栏

一致性模型

有时候,在跟一些同学讨论 TiKV 事务模型的时候,我都提到了 Linearizability,也提到了 Snapshot Isolation,以及需要手动 l...

710
来自专栏安恒网络空间安全讲武堂

Python编写渗透工具学习笔记二 | 0x04编写程序分析流量检测ddos攻击

0x04编写程序分析流量 检测ddos攻击 1使用dpkt发现下载loic的行为 LOIC,即Low Orbit Ion Cannon低轨道离子炮,是用于压力测...

5626
来自专栏大魏分享(微信公众号:david-share)

PowerVM虚拟化环境下 CPU 利用率的监控与探究

本文主要介绍在 PowerVM 虚拟化环境下,微分区 CPU 利用率的监控方法,并且深入讨论在虚拟化环境下,CPU 的调度原理。 普通 LPAR CPU 利用率...

3615

扫码关注云+社区