关于 db-concurrency
用于数据库审计的技能,检查应用与模式中的并发风险,涵盖关系型、键值、文档和宽列存储。它结合静态检查与数据库查询,并区分潜在风险和已确认的运行时争用。
主要功能
- 01检查事务隔离级别选择
- 02识别不安全的读改写模式
- 03检查队列锁与 SKIP LOCKED
- 04检查幂等键和条件写入
- 05建议事务级 advisory lock
- 06用数据库统计验证争用
适用场景
- 01审查余额或库存更新逻辑
- 02评估数据库工作队列的锁策略
- 03检查重试是否导致重复写入
- 04调查实时锁等待与死锁
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ hainrixz/ claude-db --skill db-concurrency安装后在 Claude Code 中输入/db-concurrency确认已加载。
详细介绍
db-concurrency (M14)
并发写入下的正确性属于 性能与规模(轴 performance)关注点:它既影响吞吐量,也决定数据在负载下能否保持一致。它为关系型 并发 w12 提供数据(也为 KV/文档/宽列配置中的 幂等性 类别提供数据)。
检查内容
- 隔离级别 — 工作负载选择的隔离级别(默认
READ COMMITTED,还是REPEATABLE READ/SERIALIZABLE)是否适合其不变量?在READ COMMITTED下进行资金/库存更新却不加锁, 会导致异常。 - 丢失更新/读取-修改-写入 — 执行
SELECT balance; …app math…; UPDATE balance=$new,却没有使用SELECT … FOR UPDATE、原子UPDATE … SET x = x - $n或乐观版本检查。这是典型的 双重支出竞态。 - 队列争用 — 使用
SELECT … FOR UPDATE却没有SKIP LOCKED的工作进程轮询器,会让所有工作进程都排队等待同一行;建议使用FOR UPDATE SKIP LOCKED。 - 幂等性(KV/文档/WC) — 写入非事务性存储(Redis、DynamoDB、Cassandra、没有会话的 Mongo)时未使用幂等键/条件写入,因此重试会重复应用操作。
- 咨询锁 — 当关键区段没有可供锁定的行时,建议使用 Postgres 咨询锁来串行化操作:
pg_advisory_xact_lock()(事务作用域,提交/回滚时自动释放),适用于领导者选举、单实例运行的 cron 作业和迁移保护。优先使用_xact_变体,而非会话作用域的pg_advisory_lock(),以免连接断开后锁泄漏。注意(交叉引用 M15): 会话作用域的咨询锁会破坏事务模式的连接池(PgBouncer)——加锁与解锁可能落在不同的后端;事务作用域的咨询锁可安全用于连接池。
评分/轴
仅为 performance 提供数据(关系型 并发 w12;KV w18/文档/宽列配置中的 幂等性)。
Tier-0(静态)
在 ORM/事务源码中搜索隔离设置、未加锁的先读后写更新序列、缺少 SKIP LOCKED 的 FOR UPDATE,以及 KV/文档/WC 写入中缺失的条件写入/幂等键。静态发现为 directional——实际争用发生在运行时(needs_api/Tier-2)。
Tier-1/2(验证)
默认隔离级别(Tier-1):SHOW transaction_isolation;(方法 connection_introspect)。
实时争用(Tier-2):
SELECT wait_event_type, wait_event, count(*)
FROM pg_stat_activity WHERE state='active' GROUP BY 1,2 ORDER BY 3 DESC;
-- and deadlock/serialization rollback counts:
SELECT datname, deadlocks FROM pg_stat_database WHERE datname = current_database();
方法 query_stat。锁等待/死锁计数可确认争用发现为 established;若没有持续的统计数据,则仍为 directional。
发现
按照 schema/finding.schema.json 输出发现项。示例:
M14.accounts.lost_update_balance— 读取-修改-写入时未加锁/未使用原子更新(severity:4,fail,轴performance,置信度directional,fixable: proposed——使用原子UPDATE或FOR UPDATE)。M14.jobs.no_skip_locked— 工作进程轮询时未使用SKIP LOCKED(severity:3,warn,directional,fixable: proposed)。M14.payments.non_idempotent_write— KV/文档写入没有幂等键(severity:3,warn,directional,fixable: advisory)。
每项发现:evidence.observed 会逐字引用事务/更新代码(已删去机密信息);verification.reproduce 是上文提到、引用 $DATABASE_URL 的隔离级别/统计查询;expected_impact 按区间划分并标注置信度(不使用未经限定的百分比)。
诚实性
- 异常的暴露风险并不能证明竞态确实发生——若没有实时死锁/序列化统计数据,这些发现为
directional,且绝不封顶。 READ COMMITTED适用于大多数工作负载;只有在某项不变量要求更强隔离时才标记它,而不能将其一概视为缺陷。- 并发修复属于应用逻辑变更(加锁、原子操作、幂等键)→
proposed/advisory,绝不为auto。