(ORACLE)如何查出引起DML锁的SQL语句

tongsh
转贴:
恒生之家
转贴 1873       2016-01-26  

这里介绍一种方法查出引起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等方法来查询操作痕迹

恒生技术之眼原创文章,未经授权禁止转载。详情见转载须知

联系我们

恒 生 技 术 之 眼