PostgreSQL 的 MVCC 下,同一事务里两次相同的 SELECT 在什么隔离级别下结果可能不同?
围绕“PostgreSQL 的 MVCC 下,同一事务里两次相同的 SELECT 在什么隔离级别下结果可能不同”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 READ COMMITTED 每条语句取新快照而 REPEATABLE READ 用事务级快照的差异。
数据库 · 数据库事务面试题第 1 页,显示第 1–50 题,共找到 50 道完整解析,可继续按分类、标签与关键词缩小范围。
按稳定语义路径排序
围绕“PostgreSQL 的 MVCC 下,同一事务里两次相同的 SELECT 在什么隔离级别下结果可能不同”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 READ COMMITTED 每条语句取新快照而 REPEATABLE READ 用事务级快照的差异。
围绕“PostgreSQL 显式事务中一条语句报错后,为什么后续语句都报 current transaction is a”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖解释事务进入失败状态必须回滚或用保存点恢复的设计理由。
围绕“数据库事务的 ACID 四个属性分别保证什么,哪些属性在并发下会打折扣”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖要求区分原子性、持久性等由日志与锁各自承担的部分。
围绕“PostgreSQL 咨询锁(advisory lock)与行锁的本质区别是什么,适合哪些应用场景”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕强调其不绑定具体行、按应用语义取锁的特性与典型用途,不列出全部咨询锁函数。
围绕“PostgreSQL 会话级与事务级咨询锁在释放时机上有什么区别,选错会导致什么问题”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答连接复用(连接池)下会话级锁泄漏的风险。
围绕“定位到阻塞其他会话的长事务后,pg_cancel_backend 与 pg_terminate_backend 该如”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要比较取消当前语句与断开整个连接的影响面及回滚代价。
围绕“先 SELECT 判断余额再 UPDATE 扣款为什么在高并发下可能超扣,有哪几种修复方式”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要比较条件 UPDATE(WHERE balance>=n)、行锁与隔离级别三种修复的强弱。
围绕“为什么给 PostgreSQL 大表加列默认值或建普通索引可能长时间锁表,有什么低影响的替代方案”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答 ACCESS EXCLUSIVE 锁的阻塞效果与 CONCURRENTLY 等低锁方案的取舍。
围绕“PostgreSQL 如何检测死锁,deadlock_timeout 参数控制的是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答等待超时后做环检测并选牺牲事务中止的机制与参数含义。
围绕“数据库死锁形成需要哪些条件,两个事务更新两张表的什么顺序会触发死锁”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕用 AB/BA 顺序交叉加锁的经典例子回答四个必要条件。
围绕“拿到 PostgreSQL 死锁日志后,如何从中还原出是哪些语句按什么顺序持锁造成的”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖要求会读日志中的进程、等待关系与涉及语句,给出固定加锁顺序的预防结论。
围绕“事务因死锁被选为牺牲者中止后,应用层的重试逻辑应该怎么写才安全”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确错误码 40P01 的识别、整事务重试与幂等性要求。
围绕“PostgreSQL 中把隔离级别设为 Read Uncommitted 会发生什么,脏读真的存在吗”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖要指出 PostgreSQL 将其映射为 Read Committed 的实现决策。
围绕“为什么 PostgreSQL 提供 FOR NO KEY UPDATE 这种行锁,它比 FOR UPDATE 弱在哪”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖要指出不修改键列的更新可用更弱锁从而减少与外键检查的冲突。
围绕“SELECT FOR UPDATE NOWAIT 与 SKIP LOCKED 在拿不到锁时行为有何不同,各自适合什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖分别用立即报错抢锁与跳过已锁行做任务队列的例子回答。
围绕“SELECT FOR UPDATE 与 FOR SHARE 锁住的行分别允许其他事务做什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要比较两种行锁强度及与 NO KEY UPDATE、KEY SHARE 的冲突关系。
围绕“为什么更新父表主键或删除父表行时可能被子表外键检查阻塞,涉及哪些锁”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明外键检查在父行上取 KEY SHARE 锁与更新锁的冲突关系。
围绕“PostgreSQL 中每条单语句自动成事务与显式 BEGIN 多语句事务在错误处理上有何差别”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要比较单语句失败即整体回滚与显式事务出错后只能 ROLLBACK 的状态差异。
围绕“面对一个转账类业务,如何在 Read Committed、Repeatable Read、Serializable ”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖按一致性需求、重试成本与吞吐给出决策依据。
围绕“PostgreSQL 的 ACCESS SHARE、ROW EXCLUSIVE、ACCESS EXCLUSIVE 这”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖要能判断 DDL 与 DML 常见组合是否互斥,不深入每种子模式的罕用场景。
围绕“设计多行更新事务时,为什么建议按固定顺序(如主键升序)加锁,如何落地”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕把统一加锁顺序如何破坏循环等待讲清楚,并给出排序后批量更新的做法。
围绕“PostgreSQL 的 lock_timeout 与 statement_timeout 分别在哪一阶段中断语句,”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖区分等锁阶段与执行阶段的超时及设置顺序的建议。
围绕“长事务对 PostgreSQL 有哪些具体危害,为什么会让 VACUUM 无法回收死元组”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答快照持有所致的最小可见事务边界阻塞清理。
围绕“并发下的丢失更新是怎么产生的,数据库有哪些手段可以阻止它”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要比较读-改-写覆写、行锁与乐观锁三种思路的取舍。
围绕“MVCC 带来的表膨胀是怎么形成的,PostgreSQL 靠什么机制回收旧版本”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答死元组来源与 VACUUM/autovacuum 的作用。
围绕“PostgreSQL 判断一个行版本对某事务是否可见时依据哪些信息”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖要说出 xmin/xmax、事务提交状态与快照的关系。
围绕“不可重复读和幻读的区别是什么,分别需要哪个隔离级别才能避免”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕用同一行被改与同谓词新增行两个例子区分,不深入到锁实现机制。
围绕“乐观锁与悲观锁在数据库并发控制中的区别是什么,分别适合什么冲突频率的场景”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖用版本号校验对比 SELECT FOR UPDATE,按冲突概率与重试成本给选型判断。
围绕“线上出现大量慢查询怀疑锁等待时,如何用 pg_locks 与 pg_stat_activity 定位是谁在阻塞谁”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖给出按 granted=false 找等待者再关联持锁会话的思路。
围绕“Read Committed 下单条 SQL 语句执行期间,其他事务提交的修改对该语句可见吗”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答语句级快照在语句开始时确定、执行中不受新提交影响的保证。
围绕“Read Committed 下 UPDATE 等待另一事务释放行锁后,为什么用最新版本重新评估 WHERE 条件”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖解释更新基于已提交最新数据重新判断条件的语义。
围绕“PostgreSQL 中 Read Committed 与 Repeatable Read 在同一事务多次读同一行时”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确每条语句取新快照与事务级快照的差别。
围绕“PostgreSQL 的只读可延迟事务(READ ONLY DEFERRABLE)在 Serializable 下能”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答等待到安全快照从而避免只读事务序列化失败的条件与限制。
围绕“设计数据库事务重试策略时,重试次数上限与退避间隔应该如何取舍”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要比较立即重试加剧争用与无限重试拖垮应用的两种极端,给出上限加抖动的原则。
围绕“为什么事务重试必须要求业务操作幂等,网络中断导致提交结果未知时会发生什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答提交结果不确定时盲目重试可能重复扣款的问题与唯一约束/去重手段。
围绕“PostgreSQL 中行级锁和表级锁分别在什么操作下产生,如何互相影响”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明意向表锁与行锁的层级关系及冲突矩阵的基本思路,不列出全部锁模式细节。
围绕“PostgreSQL 保存点(SAVEPOINT)允许事务内部分回滚,它与重试整条语句的方案有何不同”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕用单条语句失败后保留已做工作的场景回答,并指出子事务的性能成本。
围绕“高频冲突场景下用 SAVEPOINT 包住语句逐条处理,为什么会带来子事务性能问题”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖解释子事务 ID 分配与可见性判断变复杂带来的开销及批量提交的替代。
围绕“PostgreSQL Serializable 隔离级别下事务可能因为什么失败,应用必须做什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确写偏序等序列化异常与错误码 40001 的重试要求。
围绕“PostgreSQL 中 SET TRANSACTION 与 SET SESSION CHARACTERISTICS”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖区分仅当前事务与会话默认两个作用域及在事务开始后不可更改的限制。
围绕“用 SELECT FOR UPDATE SKIP LOCKED 实现数据库任务队列时如何保证同一任务不被两个 wor”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答领取-处理-提交的事务边界与锁配合。
围绕“PostgreSQL 导出事务快照(pg_export_snapshot)解决的是什么一致性问题”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖要说明多个并行连接共享同一快照做一致性读取的场景。
围绕“PostgreSQL 的 snapshot_too_old 参数为什么会让长事务报错,解决了什么运维问题”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答限制快照保留时间以避免无限膨胀的取舍。
围绕“PostgreSQL 的事务 ID 回卷问题是怎么产生的,为什么要求定期 VACUUM FREEZE”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答 32 位事务 ID 比较机制失效的风险与冻结旧元组的防护。
围绕“PostgreSQL 预备事务(PREPARE TRANSACTION)解决什么问题,为什么残留预备事务很危险”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答跨系统两阶段提交的用途及持锁阻塞 vacuum 的运维风险。
围绕“高并发计数器更新同一行成为热点时,为什么性能会急剧下降,有哪些缓解手段”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖从行锁串行化解释瓶颈并比较分桶计数、异步汇总等设计。
围绕“INSERT ON CONFLICT DO UPDATE 相比先查再插为什么能避免并发下的重复键错误”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答单条语句的原子性消除查插间隙的原理。
围绕“用版本号列实现乐观并发控制时,UPDATE 语句应如何写,更新行数为 0 意味着什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答带版本条件的原子更新与零行影响的冲突判定及后续处理。
围绕“什么是写偏序(write skew),为什么 Repeatable Read 下仍可能发生”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕用两个事务读同一快照再分别更新不同行破坏不变量的例子回答。
围绕“PostgreSQL 中两个事务并发更新同一行时,后到的事务会经历什么过程”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须区分 Read Committed 下等待并重读最新版本与 Repeatable Read 下直接报错的差异。