本文概述
- 并发控制问题
- 并发控制协议
- 在并发控制中, 可以同时执行多个事务。
- 可能会影响交易结果。保持这些事务的执行顺序非常重要。
- 更新丢失
- 脏读
- 不可重复读
- 当两个访问同一数据库项的事务以某种方式使某些数据库项的值不正确的方式包含其操作时, 就会发生丢失更新的问题。
- 如果两个事务T1和T2读取了一条记录然后对其进行了更新, 则第二条更新将覆盖第一条记录的更新效果。
文章图片
这里,
- 在时间t2, 事务X读取A的值。
- 在时间t3, 事务Y读取A的值。
- 在时间t4, Transactions-X根据在时间t2看到的值写入A的值。
- 在时间t5, 事务-Y根据在时间t3看到的值写入A的值。
- 因此, 在时间T5, 事务X的更新丢失了, 因为事务y覆盖了它, 而没有查看其当前值。
- 这种类型的问题称为“丢失更新问题”, 因为此处丢失了一个事务进行的更新。
- 当一个事务更新数据库的一项, 然后由于某种原因该事务失败时, 发生脏读取。更新的数据库项目在被更改回原始值之前, 将被另一个事务访问。
- 事务T1更新记录, 该记录由T2读取。如果T1中止, 则T2现在具有从未构成稳定数据库一部分的值。
文章图片
- 在时间t2, 事务Y写入A的值。
- 在时间t3, 事务X读取A的值。
- 在时间t4, 事务Y回滚。因此, 它将A的值改回到t1之前的值。
- 因此, Transaction-X现在包含一个从未成为稳定数据库一部分的值。
- 这种类型的问题称为“脏读问题”, 因为一个事务读取的脏值尚未提交。
- 不一致的检索问题也称为不可重复读取。当一个事务在一组数据上计算某个汇总函数而其他事务正在更新数据时, 就会发生不一致的检索问题。
- 事务T1读取记录, 然后执行其他一些处理, 在此期间事务T2更新记录。现在, 当事务T1读取记录时, 新值将与先前值不一致。
假设两个交易对三个帐户进行操作。
文章图片
文章图片
- 事务X执行所有余额的总和, 而事务Y将金额50从帐户1转移到帐户3。
- 在这里, 事务X产生的结果550不正确。如果我们将产生的结果写入数据库, 则数据库将变为不一致状态, 因为实际总和为600。
- 在这里, transaction-X看到数据库的状态不一致。
- 基于锁的协议
- 时间戳协议
- 基于验证的协议
推荐阅读
- DBMS冲突可序列化时间表
- DBMS群集文件组织
- DBMS检查点
- DBMS SQL的特点
- DBMS Boyce Codd范式(BCNF)
- DBMS和B+树原理
- DBMS B+文件组织
- DBMS体系结构(架构)
- DBMS聚合详解