基于oracle中锁的深入理解 |
本文标签:oracle,锁 ORACLE里锁有以下几种模式: 数字越大锁级别越高, 影响的操作越多 。 2级锁有:Select for update,Lock For Update,Lock Row Share 3级锁有:Insert, Update, Delete, Lock Row Exclusive 4级锁有:Create Index, Lock Share locked_mode为2,3,4不影响DML(insert,delete,update,select)操作, 但DDL(alter,drop等)操作会提示ora-00054错误 。 ORA-00054: resource busy and acquire with NOWAIT specified 5级锁有:Lock Share Row Exclusive 当对父表进行修改时,若子表对应的记录存在,则产生ORA-02292 当对子表进行修改时,则除了对子表加加TX锁和RX锁外;对父表 上面锁说的修改,都是对子父表存在参考完整性的字段操作的 。 6级锁有:Alter table, Drop table, Drop Index, Truncate table, Lock Exclusive 复制代码 代码如下: col owner for a12 col object_name for a30 col machine for a32 col USERNAME for a16 col OSUSER for a16 查看当前会话sid: select sid from v$mystat where rownum<=1 ; 查看当前session情况: select machine,username,sid,serial#,type,osuser,status from v$session; 查看当前数据库里锁的情况可以用如下SQL语句: 复制代码 代码如下: select s.username,o.object_name,s.machine,s.sid,s.serial#,k.type from v$locked_object l,dba_objects o ,v$session s,v$lock k where l.object_id = o.object_id and l.session_id=s.sid and k.sid=s.sid 如果有长期出现的一列,可能是没有释放的锁 。我们可以用下面SQL语句杀掉长期没有释放非正常的锁:alter system kill session sid,serial#; 如果出现了锁的问题, 某个DML操作可能等待很久没有反应 。 如果利用上面的命令杀死一个进程后,进程状态被置为"killed",但是锁定的资源很长时间没有被释放,那么可以在os一级再杀死相应的进程(线程),首先执行下面的语句获得进程(线程)号: 复制代码 代码如下: select spid, osuser, s.program from v$session s,v$process p where s.paddr=p.addr and s.sid=#sid (#sid是上面查到的sid) 4.在OS上杀死这个进程(线程): 1)在unix上,用root身份执行命令: #kill -9 #spid(即上面查到的spid) 2)在windows用orakill杀死线程,orakill是oracle提供的一个可执行命令,语法为: orakill sid thread 其中: sid:表示要杀死的进程属于的实例名 thread:是要杀掉的线程号,即上面查到的spid 。 例:c:>orakill orcl #spid 当采用的是直接连接数据库的方式,也不要用OS系统命令 $kill process_num 或者 $kill -9 process_num来终止用户连接,因为一个用户进程可能产生一个以上的锁, 杀OS进程幷不能彻底清除锁的问题 。 rs和rx的区别在什么地方? Row Exclusive (RX): INSERT, UPDATE, DELETE Row Share (RS): SELECT... FOR UPDATE 两者都是TM table lock modes held by DML transactions 。还是有一点区别的,一是产生的不一样 。二是rx锁后,其他transactions甚至都读不到更改后的结果 。而rs对其他 transactions而言读是没有问题的,所以叫它rs 。虽然都是指在表的层面上Prevents other transactions from manually locking the table, 一个是for exclusive reading or writing,而另一个是for exclusive write access. 这也就是rs的s(share)表现的地方 。 |