我正在阅读《ANSI SQL 隔离级别批判》 ,并对这两个定义感到困惑:
w1[x]...w2[x]...((c1 或 a1) 和 (c2 或 a2) 任意顺序)
r1[x]...w2[x]...w1[x]...c1
丢失更新的历史定义不包括脏写吗?(w2[x]...w1[x] 部分)。如果是,那么如果我们防止脏写,我们就可以防止丢失更新,对吗?我知道这显然是错误的,但我不明白为什么。谁能对我在这里误解的内容给出一些提示?非常感谢!
我找到了解释这个例子的文章:
由于 T2 在 T1 写入 x 之前提交,因此不存在脏写。
但是丢失更新的定义并不要求第二次写入发生在第一个事务提交之后,对吧?
我读到了有关数据库隔离级别和事务现象的内容。脏读是显而易见的,但我不明白脏写。
所有对脏写的描述都是这样的:
脏写是指一个进程保存的文件数据已被另一个进程在磁盘上更改。最后一个进程将覆盖第一个进程的数据。https://gerardnico.com/data/property/dirty_write
其他一些描述使用示例来演示脏写,但没有说明如何解决该问题。https://esb-dev.github.io/mat/IsoLevel.pdf
这是示例中的脏写:
- 萨尔多从 100 开始
- T2 开始:更新 Acct 设置 Saldo = 200,其中 Acct = 1
- T1 开始:更新 Acct 设置 Saldo = 250,其中 Acct = 1
- T1 提交 => Saldo=250
- T2 提交 => Saldo=200
不知道当隔离级别不允许脏写时会发生什么。
我不知道我应该从事务管理中得到什么。修改后的例子: