数据库事务中的脏读是什么?


当许多事务同时执行时,我们称它们为并发事务。并发性是为了提高时间效率。如果许多事务试图访问相同的数据,则会出现不一致性。需要并发控制来维护数据的一致性。

为了并发运行事务,我们交错它们的运算。每个事务都会获得一部分计算时间。

事务中的问题

这会导致以下问题:

  • 丢失更新问题。(WW 冲突)
  • 脏读/临时更新。(WR 冲突)
  • 不可重复读/分析错误问题。(RW 冲突)

所有这些都是因为隔离性被破坏了。

让我们讨论一下脏读或临时更新。

脏读

脏读是指读取未提交的数据。如果某一行数据被另一个正在运行的应用程序修改但尚未提交,而我们也运行一个应用程序来读取同一行数据,并读取了该未提交的数据,这就是我们所说的脏读状态。

主要的一点是,脏读者必须停止读取脏数据。

如果在这里执行某个操作,我们可以尝试使用共享锁来阻止其他事务修改该行。

脏读问题的示例

示例 1

  • 步骤 1 - 考虑一个在线购物系统,用户可以在同一时间购买和查看商品。

  • 步骤 2 - 假设用户试图购买一件商品,并且一旦用户购买了该商品,更新库存中的计数值将立即更改。

  • 步骤 3 - 假设库存中有 10 件商品,但现在只有 9 件了。

  • 步骤 4 - 此外,由于此事务,还将与计费网关进行通信。

  • 步骤 5 - 同时,如果任何其他用户也在同一时间进行交易,则新用户将能够看到库存中有 9 件商品。

  • 步骤 6 - 但是,假设第一个用户由于某些错误或资金不足而无法完成他的/她的交易。

  • 步骤 7 - 那么,在这种情况下,第一个用户完成的事务将回滚,现在库存中的值将再次变为 10。

  • 步骤 8 - 但是,当第二个用户进行交易时,库存中的商品数量为 9。

  • 步骤 9 - 这称为脏数据,整个问题称为脏读问题。

示例 2

考虑另一个示例

假设 T2 读取了 T1 对 X 进行的更新值,但 T1 失败并回滚。因此,T2 读取了 X 的错误值。

T1T2
read(x)
X=X-5
write(x)

read(x)

x=x+5

write(x)
ROLLBACK

commit

更新于: 2021-07-08

11K+ 浏览量

开启你的职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.