mcpField
D
db-concurrency

db-concurrency

github.com/hainrixz数据与数据库2170 次安装3 天前更新
代码仓库

关于 db-concurrency

用于数据库审计的技能,检查应用与模式中的并发风险,涵盖关系型、键值、文档和宽列存储。它结合静态检查与数据库查询,并区分潜在风险和已确认的运行时争用。

主要功能

  1. 01检查事务隔离级别选择
  2. 02识别不安全的读改写模式
  3. 03检查队列锁与 SKIP LOCKED
  4. 04检查幂等键和条件写入
  5. 05建议事务级 advisory lock
  6. 06用数据库统计验证争用

适用场景

  1. 01审查余额或库存更新逻辑
  2. 02评估数据库工作队列的锁策略
  3. 03检查重试是否导致重复写入
  4. 04调查实时锁等待与死锁

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/hainrixz/claude-db --skill db-concurrency

安装后在 Claude Code 中输入/db-concurrency确认已加载。

详细介绍

db-concurrency (M14)

并发写入下的正确性属于 性能与规模(轴 performance)关注点:它既影响吞吐量,也决定数据在负载下能否保持一致。它为关系型 并发 w12 提供数据(也为 KV/文档/宽列配置中的 幂等性 类别提供数据)。

检查内容

  1. 隔离级别 — 工作负载选择的隔离级别(默认 READ COMMITTED,还是 REPEATABLE READ/SERIALIZABLE)是否适合其不变量?在 READ COMMITTED 下进行资金/库存更新却不加锁, 会导致异常。
  2. 丢失更新/读取-修改-写入 — 执行 SELECT balance; …app math…; UPDATE balance=$new,却没有使用 SELECT … FOR UPDATE、原子 UPDATE … SET x = x - $n 或乐观版本检查。这是典型的 双重支出竞态。
  3. 队列争用 — 使用 SELECT … FOR UPDATE 却没有 SKIP LOCKED 的工作进程轮询器,会让所有工作进程都排队等待同一行;建议使用 FOR UPDATE SKIP LOCKED。
  4. 幂等性(KV/文档/WC) — 写入非事务性存储(Redis、DynamoDB、Cassandra、没有会话的 Mongo)时未使用幂等键/条件写入,因此重试会重复应用操作。
  5. 咨询锁 — 当关键区段没有可供锁定的行时,建议使用 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。

评论

支持 Markdown