2019独角兽企业重金招聘Python工程师标准>>>

我们都知道Oracle是一个大并发的数据库,有了锁数据库才可能实现大并发,也是应为锁Oracle大并发受到影响。

首先介绍下如何判断数据库是否有锁,来看一个视图:

v$lock

type:TM 表锁 或者DML锁

TX 行锁 事务锁

lmode:会话保持的锁模式

0 = none

1 = null

2 = Row-S(SS 行级共享锁 ,只能查询这些对象)

3 = Row-X(行级排他锁,在提交前不允许修改)

4 = Share(共享锁)

5 = S/ROW-X(共享行级排他锁)

6 = Exclusive(排他锁)

ID1,ID2 根据Type取值不同而不同。

对于type=TM表级锁或者DML锁, ID1表示被锁定表的object_id,ID2 为0 ;

对于type=TX事务锁,ID1表示高事务所占用的回滚段及事务槽,ID2表示为 环绕warp次数,即事务槽被重用的次数

REQUEST:表示会话请求锁类型

block:表示堵塞了别的会话对该锁对象的请求次数,重点关注大于 1 ,等待锁类型由lmode决定,

SQL> select sid,type, id1,id2,LMODE,REQUEST,BLOCK from v$lock where type in ('TM','TX') order by type,sid;SID TY        ID1        ID2      LMODE    REQUEST      BLOCK---------- -- ---------- ---------- ---------- ---------- ----------133  TX    1996         1701        0          6         0       135  TX    1996         1701        6          0         1

133 会话持有TX锁,锁类型类0,要请求6号锁,堵塞别人0 次,

135 会话持有TX锁,所类型为6(排他锁),堵塞过别人一次;从ID1,ID2可知  这两个会话请求的对象都一样,可见 135堵塞了133。

可以看到一点,lmode = 0 表示会话没有持有锁,但是 很有可能被别的会话给堵塞了,具体要REQUEST 字段和ID1,ID2字段

死锁查询:

select a.sid,b.sid,a.type,a.id1,a.id2,a.ctime from v$lock a,v$lock b where a.id1=b.id1 and a.id2=b.id2 and a.block > 1 and b.block =0;

查询死锁对象:

select ls.sid,ls.serial#,o.object_name from  (select s.osuers,s.username,l.type,s.paddr,l.lmode,s.sid,s.serial# ,l.id1,l.id2 from v$session s,v$lock l where s.sid=l.sid) ls ,v$object o

where o.object_id=ls.id1;

测试:

对一张表在不同的会话进行update更行

SQL> select sid,type,id1,id2,lmode,request,block from  v$lock where type in ('TX','TM');SID TYPE        ID1        ID2      LMODE    REQUEST      BLOCK---------- ---- ---------- ---------- ---------- ---------- ----------5 TX       131079        777          0          6          068 TM        74569          0          3          0          05 TM        74569          0          3          0          068 TX       131079        777          6          0          1SQL>

我们可以看到 sid 为5的会话持有3号锁(R/X 行级排它锁),请求6号锁(排它锁),请求对象是74569   ,发生事务是 ‘ 131079 ,777 ’ 。

sid=68,持有6号锁和3号锁,加锁的对象是 74569,堵塞了别人锁请求一次。

所以问题和明显了,sid=68的会话在对象74569 上加了一个6号锁,而sid=5的会话需要请求对象74569 的一个6号锁,我们知道6号锁是一个排它锁,会话互斥,所以堵塞了1次别人锁请求。

SQL> select object_name,owner ,object_id from dba_objects where object_id=74569;OBJECT_NAME          OWNER                 OBJECT_ID-------------------- -------------------- ----------TEST1                SYS                       74569

可以看到发生锁的对象是 sys.Test1表。

SQL> select sid,serial#,sql_id from v$session where sid in (select sid from v$lock where type in ('TX','TM'));SID    SERIAL# SQL_ID---------- ---------- --------------------------5         68 0d4ag0mv6hqcp68         82
SQL> select sql_text,sql_id from v$sql where sql_id='0d4ag0mv6hqcp';SQL_TEXT--------------------------------------------------------------------------------SQL_ID--------------------------update test1 set object_name='test1' where object_id=200d4ag0mv6hqcp

以上可以看到,堵塞的sql_text 。

这样就好解决了,找到这个sql的开发或者业务,告诉他这个sql堵塞了别的会话,排查是不是没有提交或者数据量比较大未执行完,要么回滚掉,要么强制杀死会话。

alter system kill session 'SID,SERIAL#' 或者  rollback;

注意:

查询v$lock视图 看到有锁不要担心,有锁未必是坏事,一定要看这个锁是否堵塞别人,就是看那个block >0的会话ji对象。

v$locked_object

This view lists all locks acquired by every transaction on the system. It shows which sessions are holding DML locks (that is, TM-type enqueues) on what objects and in what mode.

只包含DML的锁信息,包括回滚段和会话的信息。

持有锁对象查询(不一定是死锁):

select t2.username,t2.sid,t2.serial#,t2.logon_time from v$locked_object t1,v$session t2 where t1.session_id = t2.sid order by logon_time

转载于:https://my.oschina.net/u/3862440/blog/2870115

Oracle数据库锁诊断相关推荐

  1. Oracle数据库锁的种类及研究

    数据库是一个多用户使用的共享资源.当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性. 在数据库中有两 ...

  2. 介绍了Oracle数据库锁的种类及研究

    http://www.dedecms.com/web-art/shujuku/Oracle/20061008/37324.html 介绍了Oracle数据库锁的种类及研究 来源:ZDNET 作者:佚名 ...

  3. Oracle 数据库自动诊断库 ADR(Automatic Diagnostic Repository)简介

    作者介绍 姚远:鼎甲科技高级技术顾问,墨天轮MVP.Oracle ACE,华为云MVP,专注于 Oracle.MySQL 数据库多年,拥有 Oracle 10g.12c OCM, MySQL 5.6. ...

  4. java+oracle数据库锁,数据库学习之Oracle数据库\记录被另一个用户锁住\解决方法...

    1.先来看看为什么会出锁住: 数据库是一个多用户使用的共享资源.当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数 ...

  5. oracle库锁表处理,oracle 数据库锁表处理 ORA-00031

    今日执行删除业务系统表中的一部分待修复数据中,出现锁表情况,具体如下: (1) 备份待删除表中的待删除数据 create table  t_renewal_stats_data_20120712 ta ...

  6. oracle数据库锁表很多,oracle锁表的原因_数据库

    怎么修改oracle最大连接数_数据库 修改oracle最大连接数的方法是:首先登录数据库,并查看数据库进程的连接数:接着查询当前会话的连接数:最后用[alter system set process ...

  7. oracle数据库的诊断目标位置,刚安装的数据库卸载 指定数据库的诊断目标位置不存在...

    指定在此 Oracle 主目录中配置的数据库名的列表 [ORCL]:ORCL 我知道你应该是用deinstall.bat卸载的.你按照我上面写的再次卸载下就可以了.即使提示些什么错误信息也不用管.你应 ...

  8. oracle 数据库锁 lock mode 的几种类型

    0, 'None ', 1, 'Null ', 2, 'Row-S(SS) ', 3, 'Row-X(SX) ', 4, 'Share(S)', 5, 'S/Row-X (SSX) ', 6, 'Ex ...

  9. oracle 数据库 锁

    首先你要知道表锁住了是不是正常锁?因为任何DML语句都会对表加锁. 你要先查一下是那个会话那个sql锁住了表,有可能这是正常业务需求,不建议随便KILL session,如果这个锁表是正常业务你把se ...

最新文章

  1. 使用Kubespray部署Kubernetes集群
  2. JAVA获取资源的方法
  3. 电大计算机基础知识试题是什么样的,计算机应用基础知识(电大试题)
  4. python序列化和反序列化
  5. python开发微信小程序-Django微信小程序后台开发教程的实现
  6. win10上安装opencv详细教程
  7. Py之textgenrnn:textgenrnn库的简介、安装、使用方法详细攻略
  8. 05-WIFI通讯客户端搭建
  9. 基于WebSocket的手机应用和浏览器应用的数据传递
  10. 阅读Unity官方技术blog笔记
  11. python风控建模_风控建模之特征筛选与建模(python)
  12. Mplayer 音量控制
  13. python列表元素的积
  14. iOS 中input隐藏输入光标
  15. 禁止百度转码和百度快照缓存的META声明
  16. linux rapidsvn 使用教程,推荐一款简单方便的SVN客户端,在百度BAE中使用RapidSVN,百度BAE SVN教程...
  17. 王逸凡的十万个为什么
  18. 前端进化史——The Evolution of Front End Development
  19. Android 集成ShareSDK实现三方登录
  20. es 主要内存使用大户

热门文章

  1. mysql中外键的作用是什么_mysql外键基本功能与用法详解
  2. 鼠标控制视角wasd移动_无线款,轻量级,稳控制:雷蛇(Razer) 毒蝰终极版鼠标的快速体验...
  3. Linux安装指定版本Angular Cli
  4. 电脑刚开机显示正在锁定计算机在怎么回事,电脑开机一直停留在诊断自动修复界面怎么回事...
  5. DDD领域驱动设计特点及难点
  6. 《系统集成项目管理工程师》必背100个知识点-85简述风险识别的原则
  7. windows下安装composer方法(不修改PATH环境变量)
  8. Android中点击按钮获取星级评分条的评分
  9. pom.xml中提示web.xml is missing and failonmissingw...
  10. Nginx+keepalived从入门到集群搭建(手把手教学,建议收藏)