1、数据库表被锁的现象
在操作数据库时,有的时候我们会很突然的遇到数据库报下面这个错误
- ORA-00054: resource busy and acquire with NOWAIT specified
第一个可能的原因是在lock table 和select for update 的句子中有nowait关键字导致报错。nowait关键字的意思是当你要锁定某一资源时,如果该资源正被别的用户锁定则直接返回错误信息,而不是等待别的用户解锁。
第二个原因是你执行了ddl语句并且这个ddl 无法获得需要的锁。
2、表被锁的解决办法
第一种办法是“治病”,采用如下方法可以解决眼前遇到的问题,既然表被锁,那么解锁就是了。
- SELECT a.username,decode(b.type,'TM','TABLE LOCK','TX','ROW LOCK',NULL) LOCK_LEVEL,
- c.owner,c.object_name,c.object_type,
- a.sid,a.serial#,a.terminal,a.machine,a.program,a.osuser
- FROM v$session a,v$lock b,dba_objects c
- WHERE b.sid = a.sid
- AND b.id1 = c.object_id(+)
- AND a.username is NOT Null;
- alter system kill session 'sid,serial#';
第二种办法是“治本”,这个办法是oracle_11g才适用的方法,
- alter session set ddl_lock_timeout = 600;
- alter system set ddl_lock_timeout = 600;