《数据库系统概念》的原文摘录

  • 决定是否允许一个更新事务的提交需要小心。两个并发执行的事务可能会更新同一个数据项。由于两个事务的操作用它们各自的私有快照隔离,因此任何事务都看不到对方所做的更新。 如果两个事务都允许写入数据库,第一个更新的写入将被第二个覆盖。结果导致一个更新丢失(lostupdate)。 快照隔离有两个变种,都防止了更新丢失。它们称为先提交者获胜和先更新者获胜。 (查看原文)
    眯眼西索 2023-09-04 14:46:33
    —— 引自章节:15.7快照隔离
  • 一对事务中的每一个都读取对方写的数据,但是不存在两者同时与的数循,这种情况称为写偏斜(write skew)。 考虑一个银行场景。假设银行通过完整性约束限制一个客户的支票账户和储蓄账户的余额之和不能为负。假设一个客户的支票账户余额和储蓄账户余额分别为100美元和200美元。假设事务T1读这两个余额,进行完整性约束核实,从支票账户中取出200美元。假设另一个并发执行的事务T2,也经过完整性约束核实,从储蓄账户中取出200美元。由于每个事务都在其快照上进行完整性约束检验,如果它们同时执行,任何一方都会相信取款后的余额之和为100美元,因此取款并不违反完整性约束。由于两个事务更新不同的数据项,它们之间不存在更新冲突,因此在快照隔离下两者都可以提交。 遗憾的是,在T1和T2都提交后的状态中,余额为-100美元,违反了完整性约束。这种违反不可能出现在T1和T2的串行执行中。 (查看原文)
    眯眼西索 2023-09-04 14:46:33
    —— 引自章节:15.7.2串行化问题
  • 表结构中添加一个额外的版本号字段,且创建时初始化为0。当一个事务(第一次)读取它将要更新的某一个元组时,记录该元组的版本号。读操作作为一个独立的数据库事务执行,因此任何所获得的锁被立即释放。 更新操作在另一个事务完成,对于每个更新的元组,事务检查当前的版本号是否等于第一次读取事务时的版本号: 1⃣️如果版本号匹配,则执行数据库中该元组的更新,并且它的版本号加1。 2⃣️如果版本号不匹配,事务中止,回滚它所执行的所有更新。 (时间戳可以用来代替版本号,而对机制没有任何影响。) 注意到上述机制和快照隔离的相似性。版本号检查实现了快照隔离中的先提交者获胜规则,而且在事务活跃时间很长的情况下也可使用。然而,与快照隔离不同,事务的读操作可能不对应数据库中的一个快照。与有效性检验协议不同,事务的读操作不进行检验。我们将以上的机制称为不做读有效性检查的乐观并发机制(optimistic concurrency control without read validation)。 (查看原文)
    眯眼西索 2023-09-04 15:13:40
    —— 引自章节:15.9.3跨越用户交互的并发控制
<前页 1 2 3 4 5 6 后页>