oracle官网当一个用户发出select..for update的错作准备对返回的结果集进行修改时,如果结果集已经被另一个会话锁定,就是发生阻塞。需要等另一个会话结束之后才可继续执行。可以通过发出 select… for update nowait的语句来避免发生阻塞,如果资源已经被另一个会话锁定,则会返回以下错误:Ora-00054:resource busy and acquire with nowait specified.

database运行变慢(transaction事务比较慢):v$session_wait(有无等待事件event:enq(tx,tm))--v$lock(有无排他exclusive lock session)--sqlarea

oracle官网死锁-deadlock

定义:当两个用户希望持有对方的资源时就会发生死锁.
即两个用户互相等待对方释放资源时,oracle认定为产生了死锁,在这种情况下,将以牺牲一个用户作为代价,另一个用户继续执行,牺牲的用户的事务将回滚.
oracle官网例子:
1:用户1对A表进行Update,没有提交。
2:用户2对B表进行Update,没有提交。
此时双反不存在资源共享的问题。
3:如果用户2此时对A表作update,则会发生阻塞,需要等到用户一的事物结束。
4:如果此时用户1又对B表作update,则产生死锁。此时Oracle会选择其中一个用户进行会滚,使另一个用户继续执行操作。
oracle官网起因:
Oracle的死锁问题实际上很少见,如果发生,基本上都是不正确的程序设计造成的,经过调整后,基本上都会避免死锁的发生。

DML锁分类表表1 Oracle的TM锁类型
锁模式 锁描述 解释 SQL操作
0 none 
1 NULL 空 Select
2 SS(Row-S) 行级共享锁,其他对象只能查询这些数据行 
Select for update、Lock for update、Lock row share
3 SX(Row-X) 行级排它锁,在提交前不允许做DML操作 
Insert、Update、Delete、Lock row share
4 S(Share) 共享锁 Create index、Lock share
5 SSX(S/Row-X) 共享行级排它锁 Lock share row exclusive
6 X(Exclusive) 排它锁 
Alter table、Drop able、Drop index、Truncate table 、Lock exclusive

oracle官网1.关于V$lock表和相关视图的说明
Column Datatype Description
ADDR RAW(4 | 8) Address of lock state object
KADDR RAW(4 | 8) Address of lock
SID NUMBER Identifier for session holding or acquiring the lock
TYPE VARCHAR2(2) Type of user or system lock
The locks on the user types are obtained by user applications. Any process that is blocking others is likely to be holding one of these locks. The user type locks are:
TM - DML enqueue 
TX - Transaction enqueue
UL - User supplied
--我们主要关注TX和TM两种类型的锁
--UL锁用户自己定义的,一般很少会定义,基本不用关注
--其它均为系统锁,会很快自动释放,不用关注
ID1 NUMBER Lock identifier #1 (depends on type)
ID2 NUMBER Lock identifier #2 (depends on type)
---当lock type 为TM时,id1为DML-locked object的object_id
---当lock type 为TX时,id1为usn+slot,而id2为seq。
--当lock type为其它时,不用关注
LMODE NUMBER Lock mode in which the session holds the lock:
0 - none
1 - null (NULL)
2 - row-S (SS)
3 - row-X (SX)
4 - share (S)
5 - S/Row-X (SSX)
6 - exclusive (X)

--1.查看处于被锁状态的表
SELECT a.object_id,
       a.session_id,
       b.object_name
  FROM v$locked_object a,
       dba_objects     b
 WHERE a.object_id = b.object_id

--2.查出锁定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.1查出锁定的object的session信息(指定object_name)
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
   and o.object_name = 'ZZOM_SEND_EMAIL'
 ORDER BY sid, s.serial#;
--3.查出锁定表的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#;

--4.查出锁定表的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;

V$locked_Object和dba_objects用object_id可以关联起来,找到dba_objects.object_name,

V$session的Sid和V$locked_object的session_id内联起来,可以从V$session中的machine找到机器名。进而找到机器。

使用alter system kill session 'sid,serial#'

select V$session.sid,V$session.machine,dba_objects.object_Name

from V$session.sid inner join V$locked_object on V$session.sid=V$locked_object.session_id

inner join dba_objects on dba_objects.object_id = V$locked_object.object_id;

-----------------------------------------------------------------------------------------------------------------------

招数一: 
   1. 查看被锁的表:     
   2.   select   p.spid,c.object_name,b.session_id,b.oracle_username,b.os_user_name   from   v$process   p,v$session   a,   v$locked_object   b,all_objects   c   where   p.addr=a.paddr   and   a.process=b.process   and   c.object_id=b.object_id     
   3.      
   4.   解锁:     
   5.   alter   system     kill   session   '146';(其中146为锁住的进程号)

招数二: 
   1. SELECT   sn.username, m.SID,sn.SERIAL#, m.TYPE,  
   2.          DECODE (m.lmode,  
   3.                  0, 'None',  
   4.                  1, 'Null',  
   5.                  2, 'Row Share',  
   6.                  3, 'Row Excl.',  
   7.                  4, 'Share',  
   8.                  5, 'S/Row Excl.',  
   9.                  6, 'Exclusive',  
  10.                  lmode, LTRIM (TO_CHAR (lmode, '990'))  
  11.                 ) lmode,  
  12.          DECODE (m.request,  
  13.                  0, 'None',  
  14.                  1, 'Null',  
  15.                  2, 'Row Share',  
  16.                  3, 'Row Excl.',  
  17.                  4, 'Share',  
  18.                  5, 'S/Row Excl.',  
  19.                  6, 'Exclusive',  
  20.                  request, LTRIM (TO_CHAR (m.request, '990'))  
  21.                 ) request,  
  22.          m.id1, m.id2  
  23.     FROM v$session sn, v$lock m  
  24.    WHERE (sn.SID = m.SID AND m.request != 0)         --存在锁请求,即被阻塞  
  25.       OR (    sn.SID = m.SID                         --不存在锁请求,但是锁定的对象被其他会话请求锁定  
  26.           AND m.request = 0  
  27.           AND lmode != 4  
  28.           AND (id1, id2) IN (  
  29.                         SELECT s.id1, s.id2  
  30.                           FROM v$lock s  
  31.                          WHERE request != 0 AND s.id1 = m.id1  
  32.                                AND s.id2 = m.id2)  
  33.          )  
  34. ORDER BY id1, id2, m.request;  
  35.   
  36. alter system kill session '91';  
  37. alter system kill session '144,633';  
  38. alter system kill session '91,21';  
  39. alter system kill session '112,5772';

oracle 查看死锁的脚本 
select * from v$lock ,dba_objects,v$session  where  object_id=v$lock.id1  and  v$lock.sid=v$session.sid

[转]查看处于被锁状态的表:v$locked_object dba_objects v$session all_objects v$sqlarea v$lock的更多相关文章

  1. mysql查看被锁住的表

    转: mysql查看被锁住的表 2019年05月14日 11:58:59 hlvy 阅读数 1068更多 分类专栏: mysql mysql   转:https://blog.51cto.com/mo ...

  2. 查看mysql是否锁表了

    1.查看表是否被锁: (1)直接在mysql命令行执行:show engine innodb status\G. (2)查看造成死锁的sql语句,分析索引情况,然后优化sql. (3)然后show p ...

  3. Mysql 查看被锁住的表

    MYSQL  查看被锁住的表 -- 本文章仅用于学习,记录   当你在mysql 执行查询语句的时候,简单的一句查询语句却卡很久,一直转圈圈的时候,这时候你就需要怀疑数据库的哪些进程,哪些事物被锁住 ...

  4. 查看Oracle是否锁表

    --Oracle数据库操作中,我们有时会用到锁表查询以及解锁和kill进程等操作,那么这些操作是怎么实现的呢?本文我们主要就介绍一下这部分内容. --(1)锁表查询的代码有以下的形式: select ...

  5. 查看Oracle数据库被锁住的表,删除锁表的进程

    锁表处理及查询 查看Oracle数据库被锁住的表,删除锁表的进程 1.查看被锁住的表 SELECT dob.object_name table_name,    lo.locked_mode, lo. ...

  6. 查询mysql 哪些表正在被锁状态

    查询mysql 哪些表正在被锁状态 show OPEN TABLES where In_use > 0; 参考链接:http://zhidao.baidu.com/link?url=tCQ70t ...

  7. 查看Oracle被锁的表以及如何解锁

    注意权限问题 1.查看是否有被锁的表: select b.owner,b.object_name,a.session_id,a.locked_modefrom v$locked_object a,db ...

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

    Oracle数据库操作中,我们有时会用到锁表查询以及解锁和kill进程等操作,那么这些操作是怎么实现的呢?本文我们主要就介绍一下这部分内容.(1)锁表查询的代码有以下的形式: select count ...

  9. Linux下如何查看哪些端口处于监听状态

    查看某一端口的占用情况: lsof -i:端口号 前提:首先你必须知道,端口不是独立存在的,它是依附于进程的.某个进程开启,那么它对应的端口就开启了,进程关闭,则该端口也就关闭了.下次若某个进程再次开 ...

随机推荐

  1. c语言中使用宏,需要注意的的几点

    使用#define来定义一些宏,进行一些简洁的替换甚至一些带参数的宏,在linux c代码中很常见,说明它很好.很有用, 但是它也有一些复杂的规矩和陷阱需要注意,下面我记录一些,仅供参考. 1.当使用 ...

  2. 在verilog中调用VHDL模块

    习惯了自己发现一些小问题,既然发现了,就记下来吧,不然又要忘了,这是多么悲痛的领悟. 今天在用vivado进行块设计时所生成的顶层模块居然是用VHDL语言描述的,这时郁闷了,表示只看过VHDL语法但没 ...

  3. LeetCode: Clone Graph 解题报告

    Clone GraphClone an undirected graph. Each node in the graph contains a label and a list of its neig ...

  4. 解决linux分区提示doesn't contain a valid partition table

    目前 partition table 大概有叁种: 最传统的 mbr.大容量的 gpt.小设备的 无; 遇上最后那种就会出现 "doesn't contain a valid partiti ...

  5. Zookeeper和分布式环境中的假死脑裂问题(转)

    Zookeeper和分布式环境中的假死脑裂问题 最近和同事聊天无意间发现他们的系统也存在脑裂的问题.想想当初在我们的系统中为了解决脑裂花了非常大的功夫,现在和大家一起讨论下脑裂,假死等等这些问题和解决 ...

  6. Android Wear Preview- 归档通知(Stacking Notifications)

    ---------------------------------------------------------------------------------------------------- ...

  7. synchronize模块

    synchronize模块 使用rsync同步文件,其参数如下: archive: 归档,相当于同时开启recursive(递归).links.perms.times.owner.group.-D选项 ...

  8. iOS边练边学--Segue数据逆传(用block代替delegate)

    一.block与方法的异同点: 相同点是都是保存代码段,什么时候执行,什么时候调用 不同点是block不受类或者对象的约束:方法收到了类或者对象的约束 二.思路:(通讯录练习) 在联系人控制器中,添加 ...

  9. 轻量级ORM框架Dapper应用四:使用Dapper返回多个结果集

    使用Dapper的QueryMultiple方法可以一次执行多条SQL语句,返回多个结果集,代码如下 using System; using System.Collections.Generic; u ...

  10. 免费CA数字证书的申请、安装、导入、导出

    http://wenku.baidu.com/link?url=oDUw50eCE5zX8tmg4N3-ddYGLt1U5aJYGEN7rk_z7t6LuMHL3M4oBstYBI_dQ1UnCtcK ...