查询当前执行的SQL,锁表与解锁

一:查询当前正在执行的SQL:

SELECT a.sid, a.serial#, a.machine, a.username, b.hash_value, c.sql_text
  FROM v$session a, v$sqlarea b, v$sqltext c
 WHERE a.sql_hash_value = b.hash_value
   AND b.hash_value = c.hash_value
 ORDER BY b.hash_value, c.piece;

查询结果如下所示:

查询当前执行的SQL,锁表与解锁

二:查看当前锁表信息:

SELECT l.session_id sid,
       s.serial#,
       l.locked_mode,
       l.oracle_username,
       l.os_user_name,
       s.machine,
       s.terminal,
       o.object_name,
       s.logon_time
  FROM v$locked_object l, all_objects o, v$session s
 WHERE l.object_id = o.object_id
   AND l.session_id = s.sid
 ORDER BY sid, s.serial#;

查询结果如下所示:

查询当前执行的SQL,锁表与解锁

此锁的原因是我使用了select ... for update;此锁为三级锁,可以看出是CIRC_PERIOD表锁住了。

查询当前执行的SQL,锁表与解锁

三:解锁:

根据上面查询出来的SID和SERIAL#来KILL SESSION,SQL如下:

alter system kill session 'SID,SERIAL#'; 

也可以根据如下SQL查询出KILL语句:

SELECT 'alter system kill session ''' || l.session_id || ',' || s.serial# || ''';'
  FROM v$locked_object l, all_objects o, v$session s
 WHERE l.object_id = o.object_id
   AND l.session_id = s.sid
 ORDER BY sid, s.serial#;

查询结果如下所示:

查询当前执行的SQL,锁表与解锁