上篇算是对lock做了一个概述,相信大家对lock也有了一定的了解,但是锁的冲突自然是不希望被看到的,那通过动态视图我们可以更加详尽地了解当前lock的情况并且进行处理,如何及时地判断锁定的情况以及及时地kill掉一些提交了引起锁定的事务的session也应该是DBA的一个重要的技能。

v$lock自然是毫无疑问最为重要的与lock相关的视图了,这个视图将记录当前session已经获得的锁定已经正在等待的锁定的信息,其中比较常用的列如下:

sid:当前session的id

type:锁的类型,类似于TX锁或者TM锁

LMODE:已经获得的锁的具体模式,是以编码形式的。

REQUEST:正在请求的锁的具体模式,也是以编码形式的。

具体来说是这样的,按照数值的高低来表示锁的级别,数值越高是说明锁的级别越高,也就说明兼容性越差。

那根据我上篇锁介绍的锁的类型再加上一个NULL和空一共有7个级别的模式如下:

0:空,代表没有任何操作

1:NULL,和空有区别,select的时候是NULL而不是空

2:RS锁  3:RX锁  4:S锁  5:SRX锁  6:X锁

ID1、ID2:锁的对象标识。对于TX锁来说我们暂时不管,对于TM锁来说ID1就是被锁的对象的对象号,可以去dba_objects表里面去查对应的被锁的对象的对象名,对于TM锁来说ID2总是为0.

BLOCK:是否阻止了其他用户获得锁定,大于0表示是,等于0说明否。

除了这个视图之外呢,还有v$locked_object,记录的是被锁住的对象的信息

比较重要的字段如下:

XIDUSN:回滚段号  XIDSLOT:槽号  XIDSQN:序列号 那这三个都是和回滚相关的,放在一边,锁和回滚的关系我们留待回滚的专辑再详述,反正oracle为了保证读一致性,在DML肯定会有回滚相关的处理。要注意,这些信息都是针对事务也就是transaction而言的。

OBJECT_ID:被锁对象ID

SESSION_ID:持有锁的sessionID

ORACLE_USERNAME:持有锁的Oracle 用户名

OS_USER_NAME:持有锁的操作系统 用户名

PROCESS:操作系统进程号

LOCKED_MODE:锁模式,和v$lock中的LMODE和REQUEST是相同的。

还有一个是v$enqueue_lock,这个表的字段和v$lock中的字段是一样的,不过这个表中只存放那些申请锁定失败然后再等待的session信息,按时间先后顺序排列,先申请锁定的session排在前面,也将会更早地获得锁定。

这些视图和v$session配合将可以显示更加具体的session的信息并且解决一定程度的冲突,有了理论以后我们来做个简单的小实验,来看看lock相关视图中最重要的v$lock的最简单的使用。

首先,先要查看到当前session的id。有两种办法,都很简单,图如下:

然后随便输入一句dml语句,o小白还是用update test set id = 3 where id = 2;

然后运行下面的sql语句,

看到结果如下:

很清楚了,一个TM锁,和理论符合的RX锁,一个是TX锁X,然后TM锁的ID1拿出来,去dba_objects里面应该可以查到该表的表名,那这里不做演示了。

然后我们再开一个session模拟锁定情况。sid = 15,运行语句update test set id = 4 where id = 2;

而刚的语句sid = 134,改成sid in (134,159),运行后结果如下:

可以看到,159正在请求行级的X锁,是被134的行级锁锁定的,但是RX锁之间是没有锁定的,不知道这个实验是不是可以让大家更加清楚RX锁和TX锁里的X锁的区别,RX锁只是说明有行在被更新,从而阻止X锁,至于行和行是不是冲突是看TX锁的。

再来看看v$enqueue_lock,再开一个session id = 147,执行和159相同的命令,然后查询锁的sql语句中简单把查询对象从v$lock变成v$enqueue_lock并且指定sid为两个锁住的session的id,结果如下:

也和理论相符合,两个都是等待TX锁,而且159首先请求,所以排在上面,解开锁定的时候自然也是159先获得锁定。

然后我们kill掉阻塞的进程,首先还必须获得session的serial#,可以这样

select serial# from v$session where sid = 134;得到结果370

然后运行命令alter system kill session ‘134,370’;

图就不贴了,成功kill掉以后可以看到159的DML语句就可以顺利执行了。

至于其他的视图的配合应用,包括v$locked_object啊大家可以自己尝试,也可以通过Google找到一些例子来实验一下,应该还是会收获颇丰的。

转载于:https://blog.51cto.com/oxiaobai/648939

来,锁个痛快(6)—— 与lock相关的视图和简单实验相关推荐

  1. 【java线程】锁机制:synchronized、Lock、Condition

    [Java线程]锁机制:synchronized.Lock.Condition 原创 2013年08月14日 17:15:55 标签:Java /多线程 74967 http://www.infoq. ...

  2. E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用) E: 无法对目录 /var/lib/apt/lists/ 加锁 问题解决方法

    E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用) E: 无法对目录 /var/lib/apt/lists/ 加锁 问题解决方法 今天在Ubun ...

  3. Ubuntu1604报错统一解决方法E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用)

    Ubuntu执行sudo apt-get update报错E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用) E: 无法对目录 /var/lib ...

  4. PostgreSQL 并发控制 -- 锁体系(spinlock,lwlock,regular lock)实现原理

    文章目录 前言 锁类型 Spinlocks 信号量方式 实现的Spinlock 初始化 SpinLockInit(lock) 加锁 SpinLockAcquire(lock) 解锁 SpinLockR ...

  5. 解决kalilinux: E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用) E: 无法对目录 /var/lib/apt/lists/

    出现下面报错: root@kali:~# apt-get update 正在读取软件包列表... 完成 E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂 ...

  6. 无法打开锁文件 /var/lib/dpkg/lock - open (13: 权限不够) 无法对状态列表目录加锁(/var/lib/dpkg/),请查看您是否正以 root 用户运行?

    在Ubuntu终端中使用安装命令Sudo apt-get install xxx时,也许会出现如下错误: 输入: apt-get install gimp 出现如下: E: 无法打开锁文件 /var/ ...

  7. E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用) E: 无法对目录 /var/lib/apt/lists/ 加锁 问题解决方法...

    使用Ubuntu16.04安装软件执行apt-get update时出现如下错误: E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用) E: 无 ...

  8. UBUNtu·E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用) E: 无法对目录 /var/lib/apt/lists/ 加锁 问题解决方法

    E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用) E: 无法对目录 /var/lib/apt/lists/ 加锁 问题解决方法 参考链接1 参 ...

  9. ubuntu报错E: 无法获得锁 /var/cache/apt/archives/lock - open (11: 资源暂时不可用)E: 无法对目录 /var/cache/apt/archives/

    ubuntu报错: E: 无法获得锁 /var/cache/apt/archives/lock - open (11: 资源暂时不可用) E: 无法对目录 /var/cache/apt/archive ...

最新文章

  1. OpenCV(十八)霍夫变换(直线、线段与圆检测)
  2. SLAM闭合回环————视觉词典BOW小结
  3. 拼多多退出春晚红包合作,由抖音补位!
  4. 蓝桥杯_算法训练_最小乘积(基本型)
  5. Flume 1.7 源码分析(二)整体架构
  6. dante pam mysql_FreeBSD下安装dante(sockd)并使用pam-pwdfile进行认证
  7. java模拟JVM的GCRoots追踪算法,对象可达性分析
  8. JS的 setTimeout 和 bind 使用 、复选框限制选定数据jq
  9. 歇后语:有牌不胡偏要杠
  10. paip.代码生成器数据源格式最佳实践
  11. html搜索联系人,联系人列表.html
  12. Win10操作系统备份与恢复篇·Windows10操作系统如何使用微PE实现备份与恢复
  13. Linux启动系统时不启动防火墙,Linux系统启动并配置防火墙的方法
  14. 小米手环5表盘bin文件解包修改
  15. 《MIT科技评论》“35位35岁以下科技创新青年”名单出炉!AI领域有5人入选 | 2020中国区...
  16. python上机考试题库_易考吧-2021年无纸化考试专用全国计算机等级考试上机考试题库:二级Python(含二级公共基础知识)...
  17. 手把手使用 vue-lic3.0 快速构建项目(全)
  18. android课程设计健身,健身软件课程设计-毕业论文.doc
  19. 开发EduSoho v8.7.10 本地播放视频超时或者快进后网络错误导致视频下载中途失败。鉴权播放次数问题
  20. 随机函数c语言对打,20165323 学习基础和C语言基础调查

热门文章

  1. wcf http 返回图片
  2. 腾讯、网易邮箱设置POP3客户端代理
  3. 【Laravel学习篇 · 一】Windows下起步就遇麻烦
  4. 406. Queue Reconstruction by Height
  5. 深入了解java线程池
  6. Openvswitch原理与代码分析(3): openvswitch内核模块的加载
  7. golang枚举类型 - iota用法拾遗
  8. Spring AOP源码分析(六)Spring AOP配置的背后
  9. 虚拟化 - 每天5分钟玩转 OpenStack(2)
  10. Linux基本命令——vi文本编辑器