Oracle 锁表查询及解锁
Oracle 锁表查询及解锁
1 前言
有一次开发完任务进行测试,发现执行存储过程的时候卡住了,刚开始以为数据量较大反应慢,但是过了一会儿还没有执行完成,于是强行结束后对存储过程进行调试,发现卡在了 insert 语句,于是猜想可能是锁表了。
2 锁表状态查询
直接执行以下命令查询被锁的表状态
--锁表查询SQL
SELECT object_name, machine, s.sid, s.serial#
FROM gv$locked_object l, dba_objects o, gv$session s
WHERE l.object_id = o.object_id
AND l.session_id = s.sid;
可以根据机器看一下是不是自己的机子导致的,果然就是我的存储过程中执行 insert 的表, 被锁住的原因是因为在前面测试过程中事务没有提交或者回滚,这个时候只要去提交或者回滚就可以解锁了。而我由于提交事务前 plsql 崩了,没有办法回到修改时的状态,并且数据也不重要,直接解锁。
解锁的语句如下,填入被锁的表对应的 sid 和 serial#即可。
--释放SESSION SQL:
--alter system kill session 'sid, serial#';
ALTER system kill session '780, 1' immediate;
3 锁视图的解决办法
替换视图的时候卡住了,应该是锁住了,与上面锁表不同,上面锁是 DML 锁,一般在执行 Update Table xxx Where xxx 的时候就会产生锁,比较常见。而视图被锁一般是 DDL 锁,主要用来保证存储过程、表结构、视图、包等数据库对象的完整性,对应 DDL 锁的是 DDL 语句,DDL 语句全称数据定义语句(Data Define Language)。用于定义数据的结构或 Schema,如:CREATE、ALTER、DROP、TRUNCATE、COMMENT、RENAME。当我们在执行某个存储过程、或者编译它的时候 Oracle 会自动给这个对象加上 DDL 锁,同时也会对这个存储过程所引用的对象加锁。这种锁的信息可以在 DBA_DDL_LOCKS 中查到。V$LOCKED_OBJECT 记录的是 DML 锁信息,所以上面查询语句查不到视图被锁的情况.
执行 sql 查询
SELECT d.name, d.mode_held, d.mode_requested, s.machine, s.sid, s.serial#
FROM dba_ddl_locks d, v$session s
Where d.session_id= s.sid
And d.name='VPR_TRUSTCONTRACT_TY'; --视图名
查询结果如下:
在 Oracle 中 DDL 锁分为:Exclusive DDL Locks(排他的 DDL)、Share DDL Locks(共享 DDL 锁)、Breakable Parse Locks(可被打破的解析锁)几类