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