ORACLE 解锁表

来源:互联网 发布:泰捷网络机顶盒哪款好 编辑:程序博客网 时间:2024/06/05 07:05

今天在做测试时遇到了一个问题,由于数据库里有许多脏数据,所以要删除表里的数据,结果表被锁住了,原因是我们有几个人在同时对数据库操作,结果表被锁住了。网上查了下解锁的方法。


.为了防止用户在同一时间并发地访问和修改资源,ORACLE使用不同类型的锁控制对数据的并发访问,以防止用户之间出现破坏性的交互操作,oracle 为处理事务自动锁定资源。锁在SQL语句开始它们与数据的相互作用时获得,并在事务的整个过程中有效。

ORACLE使用两种锁模式:

1.独占模式(排他):不允许其他任何并发会话以任何方式共享锁定的资源,修改数据时需要这种锁。

2.共享模式:允许对同一块数据的并发读访问。在更改数据时,上升为独占模式。

)行级锁

insert update delete 隐式加行锁(排他)

select ... for update 显示加行锁(共享)

select ...for update 用于显示锁定将要更新的数据行,防止其他用户在更新之前操作此行

如:select * from emp where deptno=30 for update

update emp set ename='Joke' where empno=7499;

在锁释放之前,其他用户不可以对锁定的数据行进行(修改,删除)操作,查询可以

假如有其他用户要锁定同一资源:可以使用wait 子句对锁的等待时间控制

如: 在另一用户中:select * from emp where deptno=30 for update wait 2 (等待2

2秒钟还未释放资源,系统将会给出提示信息

)表级锁

共享模式(in share mode)

共享更新模式(in share update mode)

排他锁模式

锁定表的通用语法:

lock table 表名 in <share or share update or exclusive mode>;

1) 共享模式

不允许其他用户插入,更新和删除行,多个用户可以同时在同一表上设置共享锁,这样设置锁的多个用户都只能执行查询

lock table emp in share mode;

2)共享更新模式(in share update mode)

允许多个用户同时锁定表的不同行允许其他用户进行DML(insert update delete select)操作 除了已锁定的行

如: lock table emp in share update mode;

select * from emp where deptno=30 for update //锁定的行

其他用户不能delete ,update 部门30的雇员信息

其他用户可以查看锁定的行: select * from emp where deptno=30

3)排他锁模式(限制性强)

不允许其他用户插入,更新和删除行允许查看数据,但只有一个用户可以在表中放置排他锁

lock table emp in exclusive mode;

死锁

如:USERA: lock table scott.emp in share mode;

USERB: lock table scott.emp in share mode ;

USERA: update scott.emp set ename='Smith' where empno=7369;

USERB: update scott.emp set job='CLERK' where empno=7521;

发生死锁

.解锁

查询出锁定的相关信息的SQL:


  --1.查出锁定object的session的信息以及被锁定的object名
  SELECT l.session_id sid, s.serial#, l.locked_mode,l.oracle_username,
  l.os_user_name,s.machine, s.terminal, o.object_name, s.logon_time
  FROM v$locked_object l, all_objects o, v$session s
  WHERE l.object_id = o.object_id
  AND l.session_id = s.sid
  ORDER BY sid, s.serial# ;
  --2.查出锁定表的session的sid, serial#,os_user_name, machine name, terminal和执行的语句
  --比上面那段多出sql_text和action
  SELECT l.session_id sid, s.serial#, l.locked_mode, l.oracle_username, s.user#,
  l.os_user_name,s.machine, s.terminal,a.sql_text, a.action
  FROM v$sqlarea a,v$session s, v$locked_object l
  WHERE l.session_id = s.sid
  AND s.prev_sql_addr = a.address
  ORDER BY sid, s.serial#;
  --3.查出锁定表的sid, serial#,os_user_name, machine_name, terminal,锁的type,mode
  SELECT s.sid, s.serial#, s.username, s.schemaname, s.osuser, s.process, s.machine,
  s.terminal, s.logon_time, l.type
  FROM v$session s, v$lock l
  WHERE s.sid = l.sid
  AND s.username IS NOT NULL
  ORDER BY sid;
  这个语句将查找到数据库中所有的DML语句产生的锁,还可以发现,
  任何DML语句其实产生了两个锁,一个是表锁,一个是行锁。

杀掉进程

--alter system kill session 'sid,serial#';
--把锁给KILL
alter system kill session '146,21177';



原创粉丝点击