You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过DB2查询排查锁与死锁?含触发器表插入锁问题

DB2锁与死锁排查及触发器相关锁说明

一、能否通过DB2查询识别锁与死锁?

可以直接通过DB2内置的系统视图和查询语句识别当前活跃锁以及历史死锁事件。

二、排查锁与死锁的常用查询语句

1. 查询当前活跃锁

获取系统中所有锁的详细信息,包括锁类型、持有对象、关联应用等:

SELECT 
    LOCK_NAME,
    LOCK_TYPE,
    LOCK_MODE,
    TABNAME,
    APPLICATION_HANDLE,
    APPLICATION_NAME,
    AGENT_ID,
    LOCK_STATUS
FROM 
    SYSIBMADM.LOCKS_HELD
ORDER BY 
    APPLICATION_HANDLE;

2. 查询等待锁的应用

定位正在等待锁资源的应用,以及等待时长:

SELECT 
    A.APPLICATION_HANDLE,
    A.APPLICATION_NAME,
    A.AGENT_ID,
    L.LOCK_NAME,
    L.LOCK_TYPE,
    L.LOCK_MODE,
    L.TABNAME,
    A.WAIT_TIME
FROM 
    SYSIBMADM.APPLICATIONS A
JOIN 
    SYSIBMADM.LOCKS_HELD L ON A.APPLICATION_HANDLE = L.APPLICATION_HANDLE
WHERE 
    A.WAIT_STATUS = 'U'
ORDER BY 
    A.WAIT_TIME DESC;

3. 查询历史死锁记录

查看近期发生的死锁事件,涉及的应用与对象:

SELECT 
    DEADLOCK_ID,
    EVENT_TIME,
    APPLICATION_HANDLE_1,
    APPLICATION_NAME_1,
    APPLICATION_HANDLE_2,
    APPLICATION_NAME_2,
    TABNAME_1,
    TABNAME_2
FROM 
    SYSIBMADM.DEADLOCKS
ORDER BY 
    EVENT_TIME DESC;

4. 查看锁等待的SQL上下文

获取等待锁的应用正在执行的SQL语句,便于定位问题:

SELECT 
    A.APPLICATION_HANDLE,
    A.APPLICATION_NAME,
    A.CLIENT_IPADDR,
    L.LOCK_NAME,
    L.LOCK_TYPE,
    L.LOCK_MODE,
    L.TABNAME,
    A.CURRENT_SQL
FROM 
    SYSIBMADM.APPLICATIONS A
JOIN 
    SYSIBMADM.LOCKS_HELD L ON A.APPLICATION_HANDLE = L.APPLICATION_HANDLE
WHERE 
    A.WAIT_STATUS = 'U';

三、触发器表插入操作的锁说明

对带有触发器的表执行插入操作时,触发器与主插入操作共享同一事务上下文:

  • 主表会被加上对应级别的锁(通常是行级X排他锁或表级IX意向排他锁,具体由隔离级别决定);
  • 若触发器涉及其他表的读写操作,这些关联表也会被加上相应锁;
  • 事务内的所有锁会在提交或回滚时释放,若触发器逻辑复杂、事务耗时久,更易引发锁等待甚至死锁。

内容的提问来源于stack exchange,提问作者mastermistik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 18:47:08