📅  最后修改于: 2020-12-12 07:45:15             🧑  作者: Mango
并发控制
- 在并发控制中,可以同时执行多个事务。
- 可能会影响交易结果。维护这些事务的执行顺序非常重要。
并发控制问题
当以不受控制的方式执行并发事务时,可能会出现一些问题。以下是并发控制中的三个问题。
1.丢失更新问题
- 当两个访问同一数据库项的事务以某种方式使某些数据库项的值不正确的方式包含其操作时,就会发生丢失更新的问题。
- 如果两个事务T1和T2读取了一条记录然后进行了更新,则第二条更新将覆盖第一条记录的更新效果。
例:
这里,
- 在时间t2,事务X读取A的值。
- 在时间t3,事务Y读取A的值。
- 在时间t4,Transactions-X根据在时间t2看到的值写入A的值。
- 在时间t5,事务-Y根据在时间t3看到的值写入A的值。
- 因此,在时间T5,事务X的更新丢失了,因为事务y覆盖了它,而没有查看其当前值。
- 这种类型的问题称为“丢失更新问题”,因为此处丢失了一个事务进行的更新。
2.脏读
- 当一个事务更新数据库的一项,然后由于某种原因该事务失败时,就会发生脏读取。更新的数据库项目在被变回原始值之前,将被另一个事务访问。
- 事务T1更新记录,记录由T2读取。如果T1中止,则T2现在具有从未构成稳定数据库一部分的值。
例:
- 在时间t2,事务Y写入A的值。
- 在时间t3,Transaction-X读取A的值。
- 在时间t4,事务Y回滚。因此,它将A的值改回到t1之前的值。
- 因此,Transaction-X现在包含一个从未成为稳定数据库一部分的值。
- 这种类型的问题称为脏读问题,因为一个事务读取的脏值尚未提交。
3.检索不一致问题
- 不一致的检索问题也称为不可重复读取。当一个事务在一组数据上计算某个汇总函数而其他事务正在更新数据时,就会发生不一致的检索问题。
- 事务T1读取记录,然后执行其他一些处理,在此期间事务T2更新记录。现在,当事务T1读取记录时,新值将与先前值不一致。
例:
假设两个交易对三个帐户进行操作。
- 事务X执行所有余额的总和,而事务Y将金额50从帐户1转移到帐户3。
- 在这里,事务X产生错误的结果550。如果我们将产生的结果写入数据库,则数据库将变为不一致状态,因为实际总和为600。
- 在这里,transaction-X看到数据库的状态不一致。
并发控制协议
并发控制协议确保并发事务的原子性,隔离性和可序列化性。并发控制协议可以分为三类: