oracle锁表

Posted vnx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle锁表相关的知识,希望对你有一定的参考价值。

一、锁表的处理

Oracle锁表比较简单,查询锁表的session杀掉就可以了。

1、以下几个为相关表

SELECT * FROM V$LOCK;

SELECT * FROM V$SQLAREA;

SELECT * FROM V$SESSION;

SELECT * FROM V$PROCESS;

SELECT * FROM V$LOCKED_OBJECT;

SELECT * FROM ALL_OBJECTS;

SELECT * FROM V$SESSION_WAIT;

2、查看被锁的表

SELECT B.OWNER, B.OBJECT_NAME, A.SESSION_ID, A.LOCKED_MODE
  FROM V$LOCKED_OBJECT A, DBA_OBJECTS B
 WHERE B.OBJECT_ID = A.OBJECT_ID;

3、查看那个用户那个进程造成死锁

SELECT B.USERNAME, B.SID, B.SERIAL#, LOGON_TIME
  FROM V$LOCKED_OBJECT A, V$SESSION B
 WHERE A.SESSION_ID = B.SID
 ORDER BY B.LOGON_TIME;

4、查看连接的进程

SELECT SID, SERIAL#, USERNAME, OSUSER FROM V$SESSION;

5、查出锁定表的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;

6、  这个语句将查找到数据库中所有的DML语句产生的锁,还可以发现,任何DML语句其实产生了两个锁,一个是表锁,一个是行锁。

7、杀掉进程 sid,serial#

ALTER SYSTEM KILL SESSION\'210,11562\';

二、for update 与 rowid 区别

有时候部分技术人员在更新记录时会忘记提交事务,造成锁表。故引出此内容。

1、Oracle 更新表的方式常用的几种:

(1)、update 表名 set 字段1=值1,字段2=值2 ... where 过滤条件;

(2)、select * from 表名 where 过滤条件 for update ;--锁定某行记录或整张表,一直等待,直到提交或回滚。

拓展:

    select * from 表名 where 过滤条件 for update of 列名 ;(用在多表连接锁定时,可以指定要锁定的是哪几张表,而如果表中的列没有在for update of 后面出现的话,就意味着这张表其实并没有被锁定,其他用户是可以对这些表的数据进行update操作的。这种情况经常会出现在用户对带有连接查询的视图进行操作场景下。用户只锁定相关表的数据,其他用户仍然可以对视图中其他原始表的数据来进行操作。 

    select * from 表名 where 过滤条件 for update 【of 列名】 wait 时间;--等待n秒后返回错误提示

    select * from 表名 where 过滤条件 for update【of 列名】  nowait  ;--马上返回错误提示

(3)、select 要更新的字段,rowid from 表名 where 过滤条件;

(4)、merge语句(用的相对比较少)

2、for update与rowid区别

for update :当语句运行时,会在对应行(where子句)加上行级锁,无where子句等于全表上锁。若遇到客户端断网、测试人员忘记提交\\回滚事务,则会发生锁表。 

rowid: 运行后并未给数据加上行级锁(通过物理地址去确定某一行数据),但可以编辑数据,提交事务的瞬间完成上锁、提交、解锁等动作,不易发生锁表。

参考:

https://www.cnblogs.com/XQiu/p/5212787.html

 oracle for update和for update nowait的区别 - 全威儒 - 博客园  https://www.cnblogs.com/quanweiru/archive/2012/11/09/2762223.html

【Oracle】-for update 与 rowid - zhaizhai的博客 - CSDN博客  http://blog.csdn.net/zhailihua/article/details/78716347

 

以上是关于oracle锁表的主要内容,如果未能解决你的问题,请参考以下文章

oracle,查看锁表

查看oracle是否锁表以及解决方法

oracle表被锁了怎么处理?

Oracle 锁表查询 和解锁表

oracle 锁表时,怎么查出是哪些SQL语句导致了锁表

oracle 锁表、解锁的语句