事务、并发与恢复
理解原子提交、隔离、锁与版本怎样共同限制并发结果。
事务给一组操作划定边界
事务将多项操作放入一个提交单元:成功提交时相关变更按实现规则生效,失败时撤销其管理范围内的变更。原子性保证这个单元的完成方式;一致性仍依赖正确的约束和操作;隔离限制并发影响;持久性说明提交后的恢复条件。
一次操作可能读取旧状态、作出决定,再写入新状态。另一参与者也这样做时,两个单独正确的流程可能产生整体错误。需要分析每一步读了什么版本、哪些写入发生冲突,以及最终状态是否符合不变量。
隔离描述允许的结果
读到未提交数据、两次读取看到不同值、条件查询集合变化,以及结果不能等价于任何串行顺序,是不同现象。隔离级别应通过允许或排除这些现象来判断。相同级别名称在不同实现里可能有不同增强保证。
例如两项独立记录各表示一个资源是否可用,要求至少一项保持可用。两个参与者分别读取另一项可用,再关闭自己的项。仅仅让两次写入发生在不同记录上并避免同记录覆盖,仍可能使两项都关闭。这类问题需要检查跨记录的读写依赖和约束范围。
锁与多版本分别解决什么
锁让竞争操作遵循一定顺序。锁住哪项对象、允许哪些操作并行、保持到何时,会影响阻塞与死锁。多个参与者持有彼此需要的锁时形成等待环;系统可能中止一方,应用必须能够恢复或重试。
多版本机制保留不同版本供不同读取视图使用。读者可在不等待某些写入的情况下取得自己的快照;更新竞争、显式锁和结构变更仍可能阻塞。旧版本只有在不再被需要时才能回收,长时间读取或事务可能延迟清理。
重试需要重新作出决定
序列化冲突表明当前执行不能按要求完成。安全重试通常需要重新开启事务、重新读取并计算整项业务,保留重试次数和等待策略。在事务中已执行的外部效果不一定能撤销,必须放进单独的重复处理契约。
客户端超时也不能直接等同于未提交。存储服务可能已经提交、响应丢失。请求身份、结果查询和条件写入能够减少重复产生的风险;采用哪项机制取决于接口提供的保证。
恢复有多个目标
进程崩溃后的日志恢复、介质损坏后的备份恢复、误删除后的时点恢复,以及副本接管,是不同目标。应明确可接受的数据损失、恢复时间和可取得材料,再选择日志、备份和副本策略。多个副本如果同时复制错误删除,仍需要独立恢复材料。
本页用教学场景解释保证。具体级别、快照和重试条件核对 PostgreSQL Transaction Isolation、Explicit Locking和 Routine Vacuuming。没有重跑并发或故障实验。
最后更新于