常常有朋友在说他要往数据库中的某张表插入数据,现在表被别人锁住了,半天不释放。
首先可以看见数据库中没有对象被锁定。
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;
未选定行