这里介绍一种方法查出引起DML锁的SQL语句
当然,此方法可能会查询不出结果
SQL> conn @test ">zhu/zhu@test
已连接。
SQL> insert into t values(200);
已创建 1 行。
SQL> conn @test ">zhuyz/zhuyz@test
已连接。
SQL> insert into tlog values(1000);
已创建 1 行。
SQL> select oracle_username,session_id,locked_mode from v$locked_object;
ORACLE_USERNAME SESSION_ID LOCKED_MODE
-
ZHU 600 3
ZHUYZ 721 3
select t1.oracle_username usename,
t1.session_id,
t3.sql_text
from v$locked_object t1,
v$session t2,
v$sql t3
where t1.session_id = t2.sid
and decode(t2.sql_address,'00',t2.prev_sql_addr,t2.sql_address) = t3.address
USENAME SESSION_ID SQL_TEXT
ZHU 600 insert into t values(200)
ZHUYZ 721 insert into tlog values(1000)
如果SQL是这样执行的
SQL> insert into t values(200);
已创建 1 行。
SQL> select * from t;
那么如上SQL没法查出INSERT语句,
因为prov_sql_addr记录的是最近一次执行的SQL的地址
然后我们还可以这样查,可以分析出是什么DML语句
select * from v$sqlarea t
where t.parsing_schema_name in('ZHU','ZHUYZ')
order by t.last_active_time desc;
上述两种查法,均可能查询不出是什么DML引起的锁
但是能查出的可能性非常大,
或者也可以查历史视图,但是历史视图的数据是采样的,也不能保证100%能查到
此外,我们还可以通过trace(慎用,严重影响性能),
或者logminer等方法来查询操作痕迹