《oracle锁表及解锁》由会员分享,可在线阅读,更多相关《oracle锁表及解锁(3页珍藏版)》请在金锄头文库上搜索。
1、一为了防止用户在同一时间并发地访问和修改资源,ORACLE使用不同类型的锁控制对数 据的并发访问,以防止用户之间出现破坏性的交互操作,oracle为处理事务自动锁定资源。 锁在SQL语句开始它们与数据的相互作用时获得,并在事务的整个过程中有效。ORACLE使用两种锁模式:1独占模式(排他):不允许其他任何并发会话以任何方式共享锁定的资源,修改数据时需 要这种锁。2共享模式:允许对同一块数据的并发读访问。在更改数据时,上升为独占模式。一)行级锁insert update delete隐式加行锁(排他)select . for update显示加行锁(共享)select .for update用于
2、显示锁定将要更新的数据行,防止其他用户在更新之前操作此行女口: select * from emp where deptno=30 for updateupdate emp set ename=Joke where empno=7499;在锁释放之前,其他用户不可以对锁定的数据行进行(修改,删除)操作,查询可以假如有其他用户要锁定同一资源:可以使用wait子句对锁的等待时间控制如: 在另一用户中:select * from emp where deptno=30 for update wait 2 (等待2秒如2秒钟还未释放资源,系统将会给出提示信息二)表级锁共享模式 (in share mo
3、de)共享更新模式 (in share update mode)排他锁模式锁定表的通用语法:lock table 表名 in ;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 *
4、from emp where deptno=30 for update /锁定的行其他用户不能delete ,update部门30的雇员信息其他用户可以查看锁定的行:select * from emp where deptno=303)排他锁模式(限制性强)不允许其他用户插入,更新和删除行允许查看数据,但只有一个用户可以在表中放置排他 锁lock table emp in exclusive mode;三)死锁女口: USERA: lock table scott.emp in share mode;USERB: lock table scott.emp in share mode ;USER
5、A: update scott.emp set ename=Smith where empno=7369;USERB: update scott.emp set job=CLERK where empno=7521;发生死锁二解锁一)查询出锁定的相关信息的SQLview plai ncopy to clipboardpri nt?selecta.sid, b.serial#, b.username, b.osuser, b.machine, b.program,c.object_name,d.spiddecode(a.type,mr, media recovery,rt,redo thread
6、,un,user name,tx, transaction,tm, dml,ul, pl/sql user lock,dx, distributed xaction,cf, control file,is, instance state,fs, file set,ir, instance recovery,st, disk space transaetion,ts, temp segment,iv, library cache invalida-tion,ls, log start or switch,rw, row wait,sq, sequence number,te, extend ta
7、ble,tt, temp table,unknown) locktype,decode(a.lmode,0, none,1, null,2, row-s,3, row-x,4, share,5, s/row-x,6, exclusive, unknown) lockmode,from v$lock a, v$session b, all_objects c, v$process dwhere a.sid = b.sidand a.type in (tm,tx)and c.object_id = a.id1and b.paddr = d.addr;二)杀掉进程-alter system kill session sid,serial#; -把锁给KILL掉alter system kill session 146,21177;