如何查找产生阻塞的SQL?
测试:
session1: 执行: select * from test_doindex where id=1 for update;
此时调整之后不做提交也不回退,并打开多个session,并执行相同的SQL,使其产生锁等待,
如下:
session2: 执行: select * from test_doindex where id=1 for update;
session3: 执行: select * from test_doindex where id=1 for update;
session4: 执行: select * from test_doindex where id=1 for update;
session5: 执行: select * from test_doindex where id=1 for update;
session6: 执行: select * from test_doindex where id=1 for update;
此时查询dba_waiters,可以发现
WAITING HOLDING LOCK_TYPE MODE_HELD MODE_REQUESTED LOCK_ID1 LOCK_ID2
137 138 Transaction None Exclusive 196640 427
138 139 Transaction None Exclusive 196640 427
137 139 Transaction None Exclusive 196640 427
154 140 Transaction Exclusive Exclusive 196640 427
141 140 Transaction Exclusive Exclusive 196640 427
137 140 Transaction Exclusive Exclusive 196640 427
154 141 Transaction None Exclusive 196640 427
141 141 Transaction None Exclusive 196640 427
此时可以通过HOLDING的SID找到session 140,但此时v$session里SQL_ID已经为空。
无法查到当生锁等待的session究竟是在执行什么SQL语句?那当然对应的open_courr也未能查到,
请问那位高人有好的方法可以指点一二?
持有锁的session未能提交或回退,status已变为inactive,无法查到当前SQL,而上一条SQL明显也不是产生锁等待的SQL。
如何找出,产生锁的SQL呢?