能否通过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
相关产品推荐
相关产品推荐

