1. 程式人生 > >手動釋放oracle資料庫中死鎖的物件鎖!

手動釋放oracle資料庫中死鎖的物件鎖!

常常有朋友在說他要往資料庫中的某張表插入資料,現在表被別人鎖住了,半天不釋放。

首先可以看見資料庫中沒有物件被鎖定。

SQL> conn /as sysdba
已連線。
SQL> select * from v$locked_object;

未選定行

現在來鎖住hr使用者的一張表。
SQL> conn hr/hr
已連線。
SQL> select * from jobs for update;

JOB_ID     JOB_TITLE                           MIN_SALARY MAX_SALARY
---------- ----------------------------------- ---------- ----------
AD_PRES    President                                20000      40000
... ...
... ...

已選擇19行。

再用scott使用者插入一條資料。

SQL> conn scott/tiger
已連線。
SQL> insert into bonus values('1','2',3,4);

已建立 1 行。

可以看見現在有兩行記錄了。

SQL> show user
USER 為 "SYS"
SQL> select * from v$locked_object;

    XIDUSN    XIDSLOT     XIDSQN  OBJECT_ID SESSION_ID ORACLE_USERNAME                OS_USER_NAME                   PROCESS      LOCKED_MODE
---------- ---------- ---------- ---------- ---------- ------------------------------ ------------------------------ ------------ -----------
         6         10        320      51566        150 SCOTT                          oracle                         3027                   3
         3         34        313      52279        158 HR                             oracle                         3000                   3

現在sys使用者可以殺死這些會話,讓他們釋放鎖!

SQL> show user
USER 為 "SYS"
SQL> select s.sid,s.serial#,s.username,to_char(s.logon_time,'yyyy-mm-dd hh24:mi:ss'),l.process,l.locked_mode 
  2  from v$locked_object l,v$session s where s.sid = l.session_id;

       SID    SERIAL# USERNAME                       TO_CHAR(S.LOGON_TIM PROCESS      LOCKED_MODE
---------- ---------- ------------------------------ ------------------- ------------ -----------
       158         38 HR                             2011-10-24 23:14:35 3000                   3
       150         28 SCOTT                          2011-10-24 23:22:45 3027                   3
使用如下語句殺死會話:Kill --alter system kill session 'sid,serial#';
SQL> alter system kill session '158,38';

系統已更改。

SQL> alter system kill session '150,28';

系統已更改。

SQL> select * from v$locked_object;

未選定行

SQL> select s.sid,s.serial#,s.username,to_char(s.logon_time,'yyyy-mm-dd hh24:mi:ss'),l.process,l.locked_mode 
  2  from v$locked_object l,v$session s where s.sid = l.session_id;

未選定行