咨询锁与锁超时与行锁升级

共 19 题
#

1. MySQL 中 innodb_lock_wait_timeout 的应用?

A 它控制死锁检测的频率
B 它控制整个事务的超时
C 它控制行锁等待超时时间,超时后回滚当前等待语句 ✓ 正确答案
D 它用于设置锁的最大数量
#

2. PostgreSQL advisory lock 的实现,pg_advisory_lock、pg_try_advisory_lock?

A 两者都非阻塞
B pg_advisory_lock 阻塞式获取,pg_try_advisory_lock 非阻塞式获取 ✓ 正确答案
C 两者都阻塞
D pg_try_advisory_lock 会阻塞直到超时
#

3. 死锁自动检测,PostgreSQL 自动检测 + 回滚一方;MySQL InnoDB 自动检测?

A 死锁检测不会回滚任何事务
B 只有 InnoDB 能检测死锁
C 死锁只能靠人工解除
D PostgreSQL 与 InnoDB 都会自动检测死锁并回滚一方 ✓ 正确答案
#

4. 锁等待的诊断,pg_locks、pg_stat_activity、INFORMATION_SCHEMA.INNODB_LOCK_WAITS?

A 只需查看日志即可
B 只有 MySQL 能诊断锁等待
C 锁等待无法诊断
D PostgreSQL 用 pg_locks + pg_stat_activity,MySQL 用 INNODB_LOCK_WAITS 定位阻塞 ✓ 正确答案
#

5. pg_locks 的应用(在 MVCC 与锁范畴内)?

A pg_locks 与 MVCC 无关
B pg_locks 只显示数据行内容
C pg_locks 无法查看锁等待
D pg_locks 显示锁类型、模式、pid、granted 等,可分析锁等待与死锁 ✓ 正确答案
#

6. MySQL InnoDB 不支持自动锁升级(与 Oracle 不同)?

A InnoDB 支持自动锁升级,与 Oracle 相同
B InnoDB 只支持表锁
C InnoDB 在锁多时升级为表锁
D InnoDB 不支持自动锁升级,始终按行粒度加锁 ✓ 正确答案
#

7. PostgreSQL 中行锁粒度,仅锁被影响的行(无升级)?

A PostgreSQL 会自动升级为表锁
B PostgreSQL 行锁只锁被影响的行,且不会升级为表锁 ✓ 正确答案
C PostgreSQL 行锁粒度是整表
D PostgreSQL 不支持行锁
#

8. 行锁升级(Lock Escalation)的概念,大量行锁升级为表锁?

A 锁升级不改变锁粒度
B InnoDB 默认启用行锁升级
C 行锁升级是把大量行锁合并为表锁以减少开销,但会降低并发 ✓ 正确答案
D 所有数据库都支持锁升级
#

9. PostgreSQL 的 deadlock_timeout 与 lock_timeout 如何分工?为什么死锁检测按周期触发而非每次锁等待都立即检测,间隔过小会带来什么开销?

A deadlock_timeout 控制死锁检测周期,lock_timeout 控制锁等待上限 ✓ 正确答案
B 两者都控制死锁检测
C 死锁检测每次锁等待都立即执行
D 死锁检测无开销
#

10. advisory lock 在定时任务单实例执行、库存预占与分布式调度中的典型用法?与唯一索引、行锁方案相比的取舍?

A advisory lock 用于定时任务单实例、库存预占等应用层协调,但不绑定具体数据 ✓ 正确答案
B advisory lock 只能用于数据行锁
C advisory lock 与唯一索引方案完全相同
D advisory lock 无法用于分布式调度
#

11. pg_locks 的 locktype(relation、tuple、transactionid、advisory 等)如何解读?如何结合 pg_stat_activity 定位持锁会话并安全终止?

A 只能直接 kill 进程
B locktype 只有一个字段
C locktype 区分 relation、transactionid、advisory 等,结合 pg_stat_activity 定位并先取消后终止会话 ✓ 正确答案
D 无法定位持锁会话
#

12. MySQL 的 innodb_lock_wait_timeout 与 lock_wait_timeout 分别控制什么?锁等待超时后事务处于什么状态、如何恢复?

A 两者都控制行锁等待
B innodb_lock_wait_timeout 控制行锁等待,lock_wait_timeout 控制元数据锁等待 ✓ 正确答案
C 锁等待超时后整个事务必回滚
D 锁等待超时无法恢复
#

13. SELECT ... FOR UPDATE 的 NOWAIT 与 SKIP LOCKED 在 MySQL、PostgreSQL 中的实现差异?任务队列并发领取为什么推荐 SKIP LOCKED?

A SKIP LOCKED 跳过已锁行,适合任务队列并发领取,避免重复与等待 ✓ 正确答案
B NOWAIT 会跳过已锁行
C 两者都会被阻塞等待
D SKIP LOCKED 只适用于 MySQL
#

14. Session 级与 Transaction 级 advisory lock 的差异?

A 两者都需显式释放
B 两者都自动释放
C session 级需显式释放,transaction 级随事务提交/回滚自动释放 ✓ 正确答案
D transaction 级可跨事务持有
#

15. lock_timeout 与 statement_timeout 的语义差异?

A lock_timeout 限制锁等待时长,statement_timeout 限制整个语句执行时长 ✓ 正确答案
B 两者都限制锁等待
C 两者都限制语句执行
D 两者语义相同
#

16. 行锁在内存中的表示与开销有多大?为什么 InnoDB 与 PostgreSQL 宁愿维护大量行锁也不做锁升级,而 SQL Server 会在阈值后升级为表锁?

A InnoDB 默认升级为表锁
B 所有数据库都升级锁
C 行锁不占内存
D InnoDB 与 PostgreSQL 为维持并发不升级锁,SQL Server 在阈值后升级为表锁控制开销 ✓ 正确答案
#

17. advisory lock 的键如何设计,pg_advisory_lock(int,int) 与 pg_advisory_lock(bigint) 的命名空间编码如何避免不同业务模块互相冲突?

A 命名空间编码无意义
B advisory lock 键无法避免冲突
C 所有键都相同才互斥
D 两个 int 形式可用第一个 int 作命名空间避免不同模块冲突 ✓ 正确答案
#

18. advisory lock 在会话级与事务级的释放语义,连接池复用会话时如何避免锁残留?

A 会话级锁在连接池复用下无残留风险
B 事务级 advisory lock 随事务自动释放,可避免连接池复用导致的锁残留 ✓ 正确答案
C 连接池与 advisory lock 无关
D 事务级锁需显式释放
#

19. MySQL 的 GET_LOCK/RELEASE_LOCK 与 PostgreSQL advisory lock 有何异同?会话断开自动释放的特性适合什么场景?

A 两者都是应用级咨询锁,会话断开自动释放,适合短生命周期互斥 ✓ 正确答案
B 两者都绑定具体数据行
C 会话断开不会释放锁
D GET_LOCK 是数据库行锁