MST

星途 面试题库

面试题:PostgreSQL中SSI技术的基本原理是什么

请简要阐述PostgreSQL里SSI(Serializable Snapshot Isolation)技术是如何保证事务的可串行化隔离级别的,涉及哪些关键机制和概念?
21.3万 热度难度
数据库PostgreSQL

知识考点

AI 面试

面试题答案

一键面试

关键机制与概念

  1. 快照隔离(Snapshot Isolation)基础
    • 事务快照:每个事务开始时,会创建一个事务快照。这个快照记录了当前数据库中所有活跃事务的列表。它允许事务在执行过程中看到一个一致的数据库视图,就好像这些活跃事务还没有进行任何修改一样。例如,事务T1开始时,它的快照会记录下当时正在运行的事务T2、T3等,T1在执行查询时,不会看到T2、T3对数据的修改,直到T1结束。
  2. 可串行化检测
    • Write - Skew检测:这是SSI防止非可串行化执行的关键机制。在快照隔离基础上,PostgreSQL会在事务提交时检查是否存在Write - Skew情况。Write - Skew发生在两个事务没有读写同一数据项,但它们的写入集如果按照不同顺序执行会导致不同结果。例如,事务T1更新行R1的列C1,事务T2更新行R2的列C2,看似不冲突,但如果这两个更新的顺序不同会影响业务逻辑(如银行转账时两个账户分别在不同事务中更新余额且更新顺序有业务要求)。PostgreSQL通过维护事务间的依赖关系图来检测Write - Skew。在事务提交时,它会检查依赖关系图,如果发现存在循环依赖(表示可能出现非可串行化执行),则回滚事务。
    • Read - Write冲突检测:当一个事务读取数据时,它基于自己的事务快照读取。如果在事务执行过程中,另一个事务修改了该事务快照内的数据(即该数据项被活跃事务修改),这就产生了Read - Write冲突。PostgreSQL会检测这种冲突,当检测到冲突时,根据情况可能回滚较晚开始的事务。例如,事务T1开始读取数据,之后事务T2修改了T1读取的数据,当T1提交时,会检测到Read - Write冲突,可能回滚T1。
  3. 事务ID与可见性规则
    • 事务ID:每个事务都有一个唯一的事务ID(XID)。事务ID在事务开始时生成,并且按照事务开始的顺序递增。
    • 可见性规则:数据行的元数据中包含创建该数据行的事务ID(xmin)和删除该数据行的事务ID(xmax,如果数据行未被删除则xmax为0)。当一个事务读取数据行时,根据事务快照和这些事务ID来判断数据行是否可见。如果xmin对应的事务在事务快照的活跃事务列表中,或者xmax对应的事务不在事务快照的活跃事务列表且xmax不为0,那么该数据行对当前事务不可见。例如,事务T1读取数据行,数据行的xmin是事务T2的ID,若T2在T1的事务快照活跃列表中,T1看不到该数据行的最新版本(因为T2还未提交,其修改对T1不可见)。

保证可串行化隔离级别原理

通过上述关键机制,PostgreSQL的SSI确保事务以一种可串行化的顺序执行。事务快照保证了每个事务在执行过程中有一个一致的视图,避免了脏读、不可重复读等问题。Write - Skew检测和Read - Write冲突检测防止了事务执行顺序不当导致的非可串行化问题,确保最终所有事务的执行效果等同于按照某个串行顺序执行。事务ID和可见性规则进一步保证了数据在事务间的正确可见性,从而全面实现了可串行化隔离级别。