数据库事务中的脏读是什么?
当许多事务同时执行时,我们称它们为并发事务。并发性是为了提高时间效率。如果许多事务试图访问相同的数据,则会出现不一致性。需要并发控制来维护数据的一致性。
为了并发运行事务,我们交错它们的运算。每个事务都会获得一部分计算时间。
事务中的问题
这会导致以下问题:
- 丢失更新问题。(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 的错误值。
| T1 | T2 |
|---|---|
| read(x) | |
| X=X-5 | |
| write(x) | |
| read(x) | |
| x=x+5 | |
| write(x) | |
| ROLLBACK | |
| commit |
广告
数据结构
网络
关系型数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP