
910
软件学报 2022 年第 33 卷第 3 期
Key words: transaction processing; data anomalies; isolation level; concurrency control algorithm; database
数据库的隔离级别是通过消除特定的数据异常来定义的. ANSI-SQL 标准
[1]
描述了 4 种数据异常: 脏写
(Dirty Write)、脏读(Dirty Read)、不可重复读(fuzzy or non-repeatable read)、幻读(phantom). 相应地,其定义了
4 种隔离级别: 读未提交、读已提交、可重复读、可串行化. 例如, 读已提交可以消除脏写和脏读异常, 最高
的可串行化级别可以消除所有的数据异常. 大多数数据库都支持了这 4 种隔离级别, 如 DB2、Informix、
MySQL、PostgreSQL、TDSQL 等. 这些数据库在默认配置下, 使用较弱的隔离级别, 而较弱的隔离级别被认
为可以提高数据库事务处理的吞吐量.
Berenson 等人
[2]
指出: ANSI-SQL 标准对数据异常的描述缺少形式化定义, 造成对数据异常的理解存在偏
差. 因此, 基于形式化表达对上述 4 个数据异常进行了重新定义, 并提出了 4 个新的数据异常: 丢失更新(Lost
Update 和 Cursor Lost Update)、读偏序(Read Skew)、写偏序(Write Skew). 截止到目前, 本文通过对相关文献
的详细调研, 发现已被公开报告过的数据异常共有 18 个
[1−12]
, 见表 1.
表 1 现存数据异常汇总
编号
异常名称
(
异常名称
,
文献
(
年份
))
形式化定义
1 Dirty Write, Ref.[1](1992), Ref.[2](1995) W
1
[x]…W
2
[x]…(C
1
or A
1
) and (C
2
or A
2
) in any order
2 Lost Update, Ref.[2](1995) R
1
[x]…W
2
[x]…W
1
[x]… C
1
3 Dirty Read, Ref.[1](1992), Ref.[2](1995) W
1
[x]…R
2
[x]…(A
1
and C
2
in either order)
4 Aborted Read, Ref.[3](2000), Ref.[4](2015) W
1
(x1:i)…R
2
(x1:i)…(A
1
and C
2
in any order)
5 Fuzzy or Non-repeatable Read, Ref.[1](1992) R
1
[x]…W
2
[x]…C
2
…R
1
[x]…C
1
6 Phantom, Ref.[1](1992) R
1
[P]…P
2
[y in P]…C
2
…R
1
[P]…C
1
7 Intermediate Read, Ref.[3](2000), Ref.[4](2015) W
1
(x1:i)…R
2
(x1:i)…W
1
(x1:j) C
2
8 Read Skew, Ref.[2](1995) R
1
[x]…W
2
[x]…W
2
[y]…C
2
…R
1
[y]…(C
1
or A
1
)
9
未命名的异常
, Ref.[5](2000)
R
3
[y]R
1
[x]W
1
[x]R
1
[y]W
1
[y]C
1
R
2
[x]W
2
[x]R
2
[z]W
2
[z]C
2
R
3
[z]C
3
10 Fractured Read, Ref.[6](2014), Ref.[7](2017) R
1
[x
0
]…W
2
[x
1
]…W
2
[y
1
]…C
2
…R
1
[y
1
]
11 Serial-concurrent-phenomenon, Ref.[8](2014) R
1
[x
0
]…W
2
[x
1
]…W
2
[y
1
]…C
2
…R
1
[y
1
]
12 Cross-phenomenon, Ref.[8](2014) R
1
[x
0
]…R
2
[y
0
]…W
3
[x
1
]…C
3
…W
4
[y
1
]C
4
…R
2
[x
1
]…R
1
[y
1
]
13 Long Fork Anomaly, Ref.[7](2017) R
4
[x
0
]…W
1
[x
1
]…R
3
[y
0
]…R
3
[x
1
]…W
2
[y
1
]…R
4
[y
1
]
14 Causality Violation Anomaly, Ref.[7](2017) R
3
[x
0
]…W
1
[x
1
]…C
1
…R
2
[x
1
]…W
2
[y
1
]…C
2
…R
3
[y
1
]
15
A Read-only Transaction Anomaly,
Ref.[9](1982), Ref.[10](2004)
R
2
(x
0
,0)R
2
(y
0
,0)R
1
(y
0
,0)W
1
(y
1
,20)C
1
R
3
(x
0
,0)R
3
(y
1
,20)C
3
W
2
[x
2
,
−
11]C
2
16 Write Skew, Ref.[2](1995) R
1
[x]…R
2
[y]…W
1
[y]…W
2
[x]…(C
1
and C
2
occur)
17 Predicate-based Write Skew, Ref.[11](2005) R
1
({x
0
in P})…R
2
({y
0
in P})…W
1
[{y
1
in P}]…C
1
…W
2
[{x
1
in P}]
18
读半已提交数据异常
(
分布式数据库
), Ref.[12](2019)
R
1
[x]…W
2
[x]…W
2
[y]…C
2
…R
1
[y]…C
1
本文的主要贡献在于: 体系化地研究了数据异常, 用统一的方法定义了数据异常(并提出 22 种未被报告
过的数据异常), 并研究了数据异常的特征, 对所有数据异常进行分类, 基于数据异常的分类方法演示了如何
基于数据异常定义不同粒度的隔离级别. 本文第 1 节描述相关工作. 第 2 节给出描述数据异常的框架, 并对数
据异常进行分类和形式化定义. 第 3 节基于数据异常的分类定义隔离级别. 第 4 节总结全文并致谢.
1 相关工作
过往研究未曾有对数据异常进行系统化地研究, 已知的文献研究提及数据异常的,主要有以下几个方面.
• 不断以案例的方式报告新的数据异常, 缺乏体系化研究.
数据异常一直没有被体系化地展开过研究, 对于数据异常的认识停留在了案例式的方式. 如表 1 所示,
2000 年、2005 年、2014 年、2017 年等都有新的数据异常被提出, 表明数据异常的研究一直没有间断过.
ANSI-SQL 标准
[1]
提出的 4 种数据异常都是单个变量构成的数据异常. 文献[3,4]提出的中间读
(Intermediate Reads)、回滚读(Abort Read)等异常也是只和单个变量相关的数据异常. 文献[2]提出的读偏序和
写偏序等异常涉及了两个变量造成的数据异常. 文献[5]提出了 3 个变量相关的类似读偏序的异常. 文献[13]
在 PostgreSQL 中讨论了更多形式的写偏序异常的变种. 文献[9,10]描述了两个变量 3 个并发事务造成的异常
(A Read-only Transaction Anomaly). 文献[6−11]提出的 3 个或 4 个事务构成的两变量异常, 没有进一步研究更
多变量是否会造成新数据异常. 尽管数据异常看似和变量个数有关, 但没有研究结果表明变量个数和异常之
评论