数据库事务隔离的级别

67次阅读
没有评论

共计 3637 个字符,预计需要花费 10 分钟才能阅读完成。

本篇内容介绍了“数据库事务隔离的级别”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让丸趣 TV 小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

1 概述与背景

这是数据库事务原理和工程实践系列文章的第一篇,本文主要在 Jim Gray 的论文 A Critique of ANSI SQL Isolation Levels 基础上分析关系数据库的事务隔离级别标准和不同隔离级别情况下的行为。第 2 节主要讨论 ANSI 标准的下的隔离级别,第 3 节主要讨论基于悲观锁实现的事务隔离级别,第 4 节主要讨论基于多版本技术的事务隔离,最后总结排序本文讨论到的各个隔离级别。

ACID 是关系数据库的一组重要特性,其中 Isolation(隔离性)描述了数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发时由于交错执行而导致数据的不一致。在最极端的情况下,数据库完全串行化执行每一个事务,所有事务之间遵守全序关系,在这种情况下,不存在并发事务间的隔离问题,但是在实际工程实践中,处于对数据库性能吞吐量的考虑,允许多个事务之间按照一定的规则,打破串行话的全序关系,ANSI SQL Isolation Levels 即规定了这种“规则”,通过将隔离性划分为 4 个级别,来换取多层级的事务间并发能力(即数据库的吞吐能力)。

注,本文内容融入了作者个人的理解,并没有严格遵守 A Critique of ANSI SQL Isolation Levels 原文的内容;其中 cursor stability 隔离级别将在后续文章中讨论,快照隔离级别与 ANSI 标准异象的比较也有所不同。

2 ANSI 事务隔离级别

ANSI SQL-92 标准 (http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt) 将数据库并发事务间的隔离性行为划分为 3 种 异象(phenomena),从低到高的自然语言定义依次为:

P1  脏读 (Dirty read): SQL-transaction T1 modifies a row. SQL- transaction T2 then reads that row before T1 performs a COMMIT. If T1 then performs a ROLLBACK, T2 will have read a row that was never committed and that may thus be considered to have never existed. 

P2 不可重复读 (Non-repeatable read): SQL-transaction T1 reads a row. SQL- transaction T2 then modifies or deletes that row and performs a COMMIT. If T1 then attempts to reread the row, it may receive the modified value or discover that the row has been deleted. 

P3 幻读 (Phantom): SQL-transaction T1 reads the set of rows N that satisfy some search condition . SQL-transaction T2 then executes SQL-statements that generate one or more rows that satisfy the search condition used by SQL-transaction T1. If SQL-transaction T1 then repeats the initial read with the same search condition , it obtains a different collection of rows.

通过依次禁止这三种异象,ANSI 确定了 4 种标准隔离级别,如下表所示:

级别 P1(脏读)P2(不可重复读)P3(幻读)Read Uncommitted 允许允许允许 Read Committed 禁止允许允许 Repeatable Read 禁止
禁止
允许 (Anomaly) Serializable 禁止
禁止
禁止
Note: The exclusion of these penomena or SQL-transactions executing at isolation level SERIALIZABLE is a consequence of the requirement that such transactions be serializable.

如标准文档所述,禁止了 P1/P2/P3 异象的事务即满足 Serializable 级别,但矛盾的是,标准文档中对 Serializable 又做了如下说明:

The execution of concurrent SQL-transactions at isolation level SERIALIZABLE is guaranteed to be serializable. A serializable execution is defined to be an execution of the operations of concurrently executing SQL-transactions that produces the same effect as some serial execution of those same SQL-transactions

它要求多个并发事务执行的效果与某种串行化执行的效果一致,但是仅仅禁止 P1/P2/P3 异象,并不一定能够保证“serial execution”的效果,因此论文中将 ANSI Serializable 称为 Anomaly Serializable。

P1/P2/P3 的形式化描述

根据标准文档的定义,可以将这三种异象使用形式化语言描述如下,称为 A1/A2/A3(其中 w1[x]表示事务 1 写入记录 x,r1 表示事务 1 读取记录 x,c1 表示事务 1 提交,a1 表示事务 1 回滚,r1[P]表示事务 1 按照谓词 P 的条件读取若干条记录,w1[y in P]表示事务 1 写入记录 y 满足谓词 P 的条件):

A1 脏读:w1[x] … r2[x] … (a1 and c2 in any order)

A2 不可重复读:r1[x] … w2[x] … c2 … r1[x] … c1

A3 幻读:r1[P] … w2[y in P] … c2 … r1[P] … c1

上述 A1/A2/A3 形式化描述,根据标准定义的 P1/P2/P3 异象的自然语言描述转化而来,但是 ANSI 标准定义的异象只针对了单个记录或谓词描述,对于多条记录需满足业务一致性的场景并未能覆盖(比如两个账户间转账要求余额总和不变),举例如下:

H1:r1[x=50]w1[x=10] r2[x=10]r2[y=50] c2 r1[y=50]w1[y=90] c1

事务 1 执行账户 x 向账户 y 转账 40,事务 2 读取到了进行到了一半的事务 1(Read Uncommitted),破坏了余额总和的一致性

因为事务 1 并未回滚,H1 的行为并不符合 A1 的形式化定义

H2:r1[x=50]

Read LockWrite Lock
Locking
Read Uncommited

none required

Well-formed Writes,

Long duration Write locks

Locking
Read CommitedWell-formed Reads,
Short duration read lock

Well-formed Writes,

Long duration Write locks

Locking
Repeatable ReadWell-formed Reads,
Long duration data-item Read locks,
Short duration Read Predicate locks

Well-formed Writes

Long duration Write locks

Locking
SerializableWell-formed Reads,
Long duration Read locks

Well-formed Writes

Long duration Write locks

将 locking 标记的四种隔离级别与 ANSI 隔离级别对比:

Well-formed Reads, Short duration read lockRead Uncommitted   Read Committed   (Repeatable Read   Snapshot)   Serializable

本文首先介绍了 ANSI 基于“异象”的隔离级别标准,并分析了其狭义和广义的描述;然后介绍了基于锁的隔离级别标准,与 ANSI 隔离级别进行了比较;最后分析快照隔离级别,在 ANSI 隔离级别标准基础上,提出了两种新的“异象”,得出快照隔离在几种标准隔离级别特性中的位置。

“数据库事务隔离的级别”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注丸趣 TV 网站,丸趣 TV 小编将为大家输出更多高质量的实用文章!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-01发表,共计3637字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)