标签: dirty-write

隔离级别:脏写和丢失更新之间的区别

我正在阅读《ANSI SQL 隔离级别批判》 ,并对这两个定义感到困惑:

脏写

w1[x]...w2[x]...((c1 或 a1) 和 (c2 或 a2) 任意顺序)

丢失更新

r1[x]...w2[x]...w1[x]...c1

丢失更新的历史定义不包括脏写吗?(w2[x]...w1[x] 部分)。如果是,那么如果我们防止脏写,我们就可以防止丢失更新,对吗?我知道这显然是错误的,但我不明白为什么。谁能对我在这里误解的内容给出一些提示?非常感谢!

我找到了解释这个例子的文章

在此输入图像描述

由于 T2 在 T1 写入 x 之前提交,因此不存在脏写。

但是丢失更新的定义并不要求第二次写入发生在第一个事务提交之后,对吧?

sql database transactions dirty-write lost-update

6
推荐指数
1
解决办法
2084
查看次数

什么是脏写?如果不被允许会怎样?

我读到了有关数据库隔离级别和事务现象的内容。脏读是显而易见的,但我不明白脏写。

所有对脏写的描述都是这样的:

脏写是指一个进程保存的文件数据已被另一个进程在磁盘上更改。最后一个进程将覆盖第一个进程的数据。https://gerardnico.com/data/property/dirty_write

其他一些描述使用示例来演示脏写,但没有说明如何解决该问题。https://esb-dev.github.io/mat/IsoLevel.pdf

这是示例中的脏写:

  1. 萨尔多从 100 开始
  2. T2 开始:更新 Acct 设置 Saldo = 200,其中 Acct = 1
  3. T1 开始:更新 Acct 设置 Saldo = 250,其中 Acct = 1
  4. T1 提交 => Saldo=250
  5. T2 提交 => Saldo=200

不知道当隔离级别不允许脏写时会发生什么。

  • T1 在提交时失败,因为当时尚未提交 T2 的更改
  • T1 提交成功,T2 提交失败,因为 T1(尚未提交)覆盖了该更改
  • T1 和 T2 提交成功,但T1默默获胜(saldo 200 而不是 250)

我不知道我应该从事务管理中得到什么。修改后的例子:

  1. 萨尔多从 100 开始
  2. T1 开始:更新 Acct 设置 Saldo = 200,其中 Acct = 1
  3. T2 开始:更新 Acct 设置 Saldo = 250,其中 …

database rdbms transactions isolation-level dirty-write

5
推荐指数
1
解决办法
8639
查看次数