DBMS并发控制
精华
小牛编辑
205浏览
2023-03-14
在并发控制中,可以同时执行多个事务。
它可能会影响事务结果。保持这些事务的执行顺序非常重要。
并发控制的问题
并发事务以不受控制的方式执行时可能会出现几个问题。 以下是并发控制中的三个问题。
- 更新丢失
- 脏读
- 不可重复读取
1. 更新丢失
- 当访问相同数据库项的两个事务包含其操作时,某些数据库项的值不正确,则会发生丢失的更新问题。
- 如果两个事务T1和T2读取记录然后更新它,那么第二个更新将覆盖更新第一个记录的效果。
示例
其中,
- 在时间t2,事务-X读取A的值。
- 在时间t3,Transaction-Y读取A的值。
- 在时间t4,Transactions-X基于在时间t2看到的值写入A的值。
- 在时间t5,Transactions-Y基于在时间t3看到的值写入A的值。
- 因此,在时间T5,Transaction-X的更新丢失,因为事务y覆盖它而不查看其当前值。
- 这种类型的问题称为丢失更新问题,因为此处丢失了一个事务所做的更新。
2. 脏读
- 在一个事务更新数据库的项目,然后由于某种原因事务失败的情况下发生脏读。 更新的数据库项在被更改回原始值之前由另一个事务访问。
- 事务T1更新由T2读取的记录。 如果T1中止,则T2现在具有从未形成稳定数据库的一部分的值。
示例:
其中
- 在时间t2,事务-Y写入A的值。
- 在时间t3,Transaction-X读取A的值。
- 在时间t4,Transactions-Y回滚。 因此,它将A的值更改回t1之前的值。
- 因此,Transaction-X现在包含一个永远不会成为稳定数据库一部分的值。
- 这种类型的问题称为脏读问题,因为一个事务读取尚未提交的脏值。
3. 不可重复读取问题
- 不一致的检索问题也称为不可重复读取。 当事务在一组数据上计算某些汇总函数而其他事务正在更新数据时,则会发生不一致的检索问题。
- 事务T1读取记录,然后进行一些其他处理,在此期间事务T2更新记录。 现在,当事务T1读取记录时,新值将与先前的值不一致。
示例:
假设有两个事务在三个账户上运作。
Transaction-X
正在进行所有余额的总和,而Transaction-Y
正在将账户1中的金额50转移到账户-3。
这里,transaction-X
产生550的结果是不正确的。 如果在数据库中写入此生成的结果,则数据库将变为不一致状态,因为实际总和为600
。
在这里,transaction-X
看到了数据库的不一致状态。
并发控制协议
并发控制协议可确保并发事务的原子性,隔离性和可串行性。 并发控制协议可以分为三类:
- 基于锁定的协议
- 时间戳协议
- 基于验证的协议