常常有朋友在说他要往数据库中的某张表插入数据,现在表被别人锁住了,半天不释放。


首先可以看见数据库中没有对象被锁定。

  1. SQL> conn /as sysdba  
  2. 已连接。  
  3. SQL> select * from v$locked_object;  
  4.   
  5. 未选定行  

现在来锁住hr用户的一张表。
  1. SQL> conn hr/hr  
  2. 已连接。  
  3. SQL> select * from jobs for update;  
  4.   
  5. JOB_ID     JOB_TITLE                           MIN_SALARY MAX_SALARY  
  6. ---------- ----------------------------------- ---------- ----------  
  7. AD_PRES    President                                20000      40000  
  8. ... ...  
  9. ... ...  
  10.   
  11. 已选择19行。  


再用scott用户插入一条数据。

  1. SQL> conn scott/tiger  
  2. 已连接。  
  3. SQL> insert into bonus values('1','2',3,4);  
  4.   
  5. 已创建 1 行。  


可以看见现在有两行记录了。

  1. SQL> show user  
  2. USER 为 "SYS"  
  3. SQL> select * from v$locked_object;  
  4.   
  5.     XIDUSN    XIDSLOT     XIDSQN  OBJECT_ID SESSION_ID ORACLE_USERNAME                OS_USER_NAME                   PROCESS      LOCKED_MODE  
  6. ---------- ---------- ---------- ---------- ---------- ------------------------------ ------------------------------ ------------ -----------  
  7.          6         10        320      51566        150 SCOTT                          oracle                         3027                   3  
  8.          3         34        313      52279        158 HR                             oracle                         3000                   3  


现在sys用户可以杀死这些会话,让他们释放锁!

  1. SQL> show user  
  2. USER 为 "SYS"  
  3. SQL> select s.sid,s.serial#,s.username,to_char(s.logon_time,'yyyy-mm-dd hh24:mi:ss'),l.process,l.locked_mode   
  4.   2  from v$locked_object l,v$session s where s.sid = l.session_id;  
  5.   
  6.        SID    SERIAL# USERNAME                       TO_CHAR(S.LOGON_TIM PROCESS      LOCKED_MODE  
  7. ---------- ---------- ------------------------------ ------------------- ------------ -----------  
  8.        158         38 HR                             2011-10-24 23:14:35 3000                   3  
  9.        150         28 SCOTT                          2011-10-24 23:22:45 3027                   3  
使用如下语句杀死会话:Kill --alter system kill session 'sid,serial#';
  1. SQL> alter system kill session '158,38';  
  2.   
  3. 系统已更改。  
  4.   
  5. SQL> alter system kill session '150,28';  
  6.   
  7. 系统已更改。  
  8.   
  9. SQL> select * from v$locked_object;  
  10.   
  11. 未选定行  
  12.   
  13. SQL> select s.sid,s.serial#,s.username,to_char(s.logon_time,'yyyy-mm-dd hh24:mi:ss'),l.process,l.locked_mode   
  14.   2  from v$locked_object l,v$session s where s.sid = l.session_id;  
  15.   
  16. 未选定行 
09-19 16:41