跳转到内容
Telemetry
数据库可靠性 SQL查询示例

查找数据库锁等待和死锁

按事件计数、等待持续时间、未解决的锁定和检测到的死锁对阻塞的数据库操作指纹进行排名。

中级database_lock_wait_events已审核 2026-07-28测试用 阿帕奇 DataFusion 45.2.0

审阅者 Telemetry产品团队 . SQL 兼容性、事件契约、合成输出和操作注意事项. 审查标准和所有权

问题已回答

哪些数据库操作会造成最严重的锁争用?

当被阻止的应用程序操作连接到稳定的阻止者指纹、等待持续时间和解决结果时,锁争用变得可操作。

活动合约

查询期望的字段

字段类型为什么存在
timestamp_utcTimestamp当观察到锁等待时。
database_nameUtf8批准的逻辑数据库名称。
blocked_query_fingerprintUtf8被阻止的应用程序操作的标准化标签。
blocking_query_fingerprintUtf8持有锁的操作的标准化标签。
lock_typeUtf8受控锁类别。
wait_msFloat64观察到的锁定等待时间(以毫秒为单位)。
resolvedBoolean等待是否结束而不保持阻塞。
deadlock_detectedBoolean数据库是否报告死锁结果。
transaction_idUtf8应用程序安全的事务标识符。
environmentUtf8部署环境。
DataFusion SQL

复制查询

sql
SELECT
  database_name,
  blocked_query_fingerprint,
  blocking_query_fingerprint,
  COUNT(*) AS lock_wait_incidents,
  COUNT(DISTINCT transaction_id) AS affected_transactions,
  AVG(wait_ms) AS average_wait_ms,
  MAX(wait_ms) AS maximum_wait_ms,
  SUM(CASE WHEN NOT resolved THEN 1 ELSE 0 END) AS unresolved_incidents,
  SUM(CASE WHEN deadlock_detected THEN 1 ELSE 0 END) AS deadlocks
FROM database_lock_wait_events
WHERE timestamp_utc >= now() - INTERVAL '7 days'
  AND environment = 'production'
GROUP BY
  database_name,
  blocked_query_fingerprint,
  blocking_query_fingerprint
HAVING COUNT(*) >= 3
ORDER BY deadlocks DESC, maximum_wait_ms DESC;

此只读查询是针对空类型表计划和执行的 阿帕奇 DataFusion 45.2.0。确定性样本输出是综合的并单独审查;根据您自己的数据验证字段类型、阈值和业务定义。 阅读测试方法。

查询结果

阻塞操作的最大锁等待时间

订单更新显示更长的等待时间、未解决的事件和检测到的死锁。

database_nameblocked_query_fingerprintblocking_query_fingerprintlock_wait_incidentsaffected_transactionsaverage_wait_msmaximum_wait_msunresolved_incidentsdeadlocks
app_productionUPDATE orders SET status = ?SELECT order FOR UPDATE881,6003,20022
analytics_productionREFRESH customer_summaryINSERT customer_event6650070000

综合示例输出。在将其用于操作决策之前,针对您自己的事件架构和阈值运行查询。

Maximum lock wait by blocked operation:来自 Find Database Lock Waits and Deadlocks 示例结果的合成 maximum_wait_ms 值的静态图表
确定性示例输出的可索引 SVG。下载它以获取带有归属的文章、操作手册或设计评论。

重现示例

下载公共装置

JSON 包包含类型化事件契约, reproducible 输入行、确切的 SQL、预期输出、审阅注释和引擎版本。 CSV 包含显示的结果。

SQL 是如何工作的

  1. 1阻塞和阻塞指纹使争用关系保持可见,而无需收集参数化 SQL。
  2. 2不同的事务计数可以保护结果免受同一等待的重复样本的影响。
  3. 3死锁和未解决的事件优先于平均等待时间较长的情况。

需要决定的边缘情况

  • 轮询可以针对一个事件发出多个观察结果。保留事务或事件标识符。
  • 数据库锁定视图可能会暴露敏感的语句文本;在发出事件之前在收集时进行标准化。
  • 预期的维护锁应带有批准的工作负载类别,以便可以对其进行分段。

推荐仪表板

  • 酒吧:maximum_wait_ms by blocked_query_fingerprint
  • 表:阻止者和被阻止的指纹对
  • 统计:未解决的事件和僵局

警报指导

仅针对影响用户可见工作流程的死锁或持续未解决的争用进行页面处理;路由维护争用分开。

读取警报设置

让查询示例发挥作用

相关埋点和指南

继续分析

在真实事件中运行它

创建表,调整字段并保存结果

免费开始,发送结构化事件,并将查询结果用作图表、共享仪表板小部件或警报输入。

获取 API 密钥