oracle 会话 lock,相克军_Oracle体系_随堂笔记014-锁 latch,lock

1、Oracle锁类型

锁的作用

latch锁:chain,链

LOCK锁

排他锁(X)

共享锁(S)

2、行级锁:DML语句

事务锁TX

锁的结构

事务锁的加锁和解锁过程

只有排他锁

不影响读(CR块)

3、表级锁:TM

行级排他锁(Row exclusive)RX锁

当我们进行DML时,会自动在被更新的表上添加RX锁,可以执行LOCK命令显式的在表上添加RX锁

允许其他事务通过DML语句修改相同表里的其他数据行

允许使用lock命令对表添加RX锁定

不允许其他事务对表添加X锁

行级共享锁(Row Shared,简称RS锁)

select … from for update

共享锁(Share,简称S锁)

通过lock table in share mode命令添加该S锁

排他锁(Exclusive,简称X锁)

通过lock table in exclusive mode命令添加X锁

共享行级排他锁(Share Row Exclusive,简称SRX锁)

通过lock table in share row exclusive mode命令添加SRX锁

4、锁的兼容性

a8e60cbf83410cd3447c738d0b316415.png

5、加锁语句以及锁的释放

lock table in [row share][row exclusive][share][share row exclusive][exclusive] mode;

6、锁相关视图

v$transaction

XIDUSN表示当前事务使用的回滚段的编号

XIDSLOT说明该事务在回滚段头部的事务表中对应的记录编号(也可以叫做槽号)

XIDSQN说明序列号

STATUS说明该事务是否为活动的

v$lock

记录了session已经获得的锁定以及正在请求的锁定的信息

SID说明session的ID号

TYPE说明锁定锁定级别,主要关注TX和TM

LMODE说明已经获得的锁定的模式,以数字编码表示

REQUEST说明正在请求的锁定的模式,以数字编码表示

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

锁定模式        锁定简称    编码数值

Row Exclusive        RX         3

Row Shared         RS        2

Share              S         4

Exclusive         X         6

Share Row Exclusive     SRX         5

NULL              N/A         0或者1

v$enqueue_lock

该视图中包含的字段以及字段含义与v$lock中的字段一模一样。

只不过该视图中只显示那些申请锁定,但是无法获得锁定的session信息。

其中的记录按照申请锁定的时间先后顺序排列,先申请锁定的session排在前面,排在前面的session将会先获得锁定。

v$locked_object

记录了当前已经被锁定的对象的信息

XIDUSN表示当前事务使用的回滚段的编号

XIDSLOT说明该事务在回滚段头部的事务表中对应的记录编号

XIDSQN说明序列号

OBJECT_ID说明当前被锁定的对象的ID号,可以根据该ID号到dba_objects里查找被锁定的对象名称

LOCKED_MODE说明锁定模式的数字编码

v$session

记录了当前session的相关信息

SID表示session的编号

SERIAL#表示序列号

SID和SERIAL#可以认为是v$session的主键,它们共同唯一标识一个session

grant select on v_$mystat to hr;

select sid from v$mystat where rownum=1;

update employees set last_name=last_name||‘a‘ where department_id=60;

select xidusn,xidslot,xidsqn,status from v$transaction;

selectsid,type,id1,id2,

decode(lmode,0,‘None‘,1,‘Null‘,2,‘Row share‘,3,‘Row Exclusive‘,4,‘Share‘,5,‘Share Row Exclusive‘,6,‘Exclusive‘) lock_mode,

decode(request,0,‘None‘,1,‘Null‘,2,‘Row share‘,3,‘Row Exclusive‘,4,‘Share‘,5,‘Share Row Exclusive‘,6,‘Exclusive‘) request_mode,

blockfromv$lockwhere sid=&sid;

select object_name from dba_objects where object_id=&object_id;

对于TM锁来说,ID1表示被锁定的对象的对象ID,ID2始终为0

对于TX锁来说,ID1表示事务使用的回滚段编号以及在事务表中对应的记录编号,ID2表示该记录编号被重用的次数(wrap)

将ID1拆解

select trunc(393249/power(2,16)) as undo_blk#,bitand(393249,to_number(‘ffff‘,‘xxxx‘)) + 0 as slot# from dual;

再次打开一个session

select sid from v$mystat where rownum=1;

update employees set last_name=last_name||‘b‘ where department_id=60;

selectsid, type, id1, id2,

decode(lmode,0,‘None‘,1,‘Null‘,2,‘Row share‘,3,‘Row Exclusive‘,4,‘Share‘,5,‘Share Row Exclusive‘,6,‘Exclusive‘) lock_mode,

decode(request,0,‘None‘,1,‘Null‘,2,‘Row share‘,3,‘Row Exclusive‘,4,‘Share‘,5,‘Share Row Exclusive‘,6,‘Exclusive‘) request_mode,

blockfromv$lockwhere sid in(&sid1,&sid2)order by sid;

再次打开一个会话

select sid from v$mystat where rownum=1;

update employees set last_name=last_name||‘c‘ where department_id=60;

查询v$enqueue_lock来获得锁定队列中的session信息

selectsid,type,

decode(request,0,‘None‘,1,‘Null‘,2,‘Row share‘,3,‘Row Exclusive‘,4,‘Share‘,5,‘Share Row Exclusive‘,6,‘Exclusive‘) request_modefromv$enqueue_lockwhere sid in(&sid1,&sid2);

select a.sid blocker_sid, a.serial#, a.username asblocker_username, b.type,

decode(b.lmode,0,‘None‘,1,‘Null‘,2,‘Row share‘,3,‘Row Exclusive‘,4,‘Share‘,5,‘Share Row Exclusive‘,6,‘Exclusive‘) lock_mode,

b.ctimeas time_held,c.sid aswaiter_sid,

decode(c.request,0,‘None‘,1,‘Null‘,2,‘Row share‘,3,‘Row Exclusive‘,4,‘Share‘,5,‘Share Row Exclusive‘,6,‘Exclusive‘) request_mode,

c.ctime time_waitedfromv$lock b, v$enqueue_lock c, v$session awhere a.sid = b.sid and b.id1= c.id1(+) and b.id2 = c.id2(+) and c.type(+) = ‘TX‘ and b.type = ‘TX‘ and b.block = 1

order by time_held, time_waited;

alter system kill session ‘&sid,&serial‘;

一个事务修改多行,产生一个TX锁

select sid from v$mystat where rownum=1;

update employees set last_name=last_name||‘a‘ where department_id=60;update departments set department_name=‘unknow‘ where department_id=10;update locations set city=‘unknown‘ where location_id=1100;

selectsid, type, id1, id2,

decode(lmode,0,‘None‘,1,‘Null‘,2,‘Row share‘,3,‘Row Exclusive‘,4,‘Share‘,5,‘Share Row Exclusive‘,6,‘Exclusive‘) lock_mode,

decode(request,0,‘None‘,1,‘Null‘,2,‘Row share‘,3,‘Row Exclusive‘,4,‘Share‘,5,‘Share Row Exclusive‘,6,‘Exclusive‘) request_mode,blockfromv$lockwhere sid=&sid;

可以获得的TX锁定的总个数由初始化参数transactions决定,而可以获得的TM锁定的个数则由初始化参数dml_locks决定

select name, value from v$parameter where name in(‘transactions‘,‘dml_locks‘);

select resource_name as "R_N", current_utilization as "C_U", max_utilization as "M_U", initial_allocation as"I_U"fromv$resource_limitwhere resource_name in(‘transactions‘,‘dml_locks‘);

7、死锁

两个session(以A和C来表示),如果A持有C正在申请的锁定,同时C也持有A正在申请的锁定时,这时发生死锁现象。死锁是典型的“双输”情况,如果任其发展,则会出现A和C这两个session正在执行的事务都无法结束的现象。因此,在Oracle数据库中,造成死锁的那个DML语句会被撤销。死锁总是由于应用程序设计不合理引起的。

当某个session的事务引起了死锁时,Oracle会自动将阻塞该事务的其他事务中相应的DML语句撤销,而阻塞该事务的其他事务中的其他DML语句并没有撤销。

session 1

select sid from v$mystat where rownum=1;update employees set last_name=last_name||‘a‘ where employee_id=100

session 2

select sid from v$mystat where rownum=1;update employees set last_name=last_name||‘b‘ where employee_id=101;

session 1

update employees set last_name=last_name||‘c‘ where employee_id=101;

session 2

update employees set last_name=last_name||‘d‘ where employee_id=100;

原文:http://www.cnblogs.com/jyzhao/p/3819381.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/395582.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TIOBE 10月编程语言排行榜 : GO 问鼎本年度语言 ?

距离2016年度编程语言的公布只剩3个月了,谁将夺得桂冠? 与去年同期相比,2016年只有Go语言和Groovy语言的增长率超过了1%。 需要注意的是,Groovy语言2015年以一个爆炸性增长的收尾,所以到2017年1月左右的增长速度可能不…

使用 ReSharper,输入即遵循 StyleCop 的代码格式化规范

StyleCop 可以帮助强制执行代码格式化规范,ReSharper 可以帮助你更高效地编写代码。把两者结合起来,你便能高效地编写符合团队强制格式化规范的代码来。 本文就介绍如何使用 ReSharper 来高效地遵循 StyleCop 的代码格式化规范。 本文内容 安装插件 Styl…

C# 控件双缓冲控制 ControlStyles 枚举详解

ControlStyles 枚举.NET Framework 4指定控件的样式和行为。 此枚举有一个 FlagsAttribute 特性,通过该特性可使其成员值按位组合。 命名空间: System.Windows.Forms程序集: System.Windows.Forms(在 System.Windows.Forms.dll …

Java 9 将采用新的版本字符串格式

在现有的版本编码格式使用了两年之后,从Java 9开始,Java版本方案将根据业内软件版本编码的最佳实践进行修改。使用或解析Java版本字符串的应用程序开发人员要注意了,因为这种变化可以会影响他们的应用程序。 正如JEP 223所阐述的那样&#xf…

jQuery(爱前端)

一 jQuery 简介 官网:www.jquery.com 口号:写更少的代码,做更多的事情 jQuery 是一个快速、小型的、特性很多的JS库,它把很多事儿都变得简单。jQuery是免费的、开源的。 jQuery 是 DOM 编程领域的霸主,极大的简化了原生…

CentOS 7 firewalld使用简介

2019独角兽企业重金招聘Python工程师标准>>> Centos升级到7之后,发现无法使用iptables控制Linuxs的端口,google之后发现Centos 7使用firewalld代替了原来的iptables。下面记录如何使用firewalld开放Linux端口: 1.快速使用说明 开启…

一个备份sql server文件.bak还原成两个数据库

一直对这个概念很模糊,今天具体一点。 备份文件只要是正常的.bak文件就好。 数据库>还原数据库 直接填写还原之后的文件名就行。 用一份备份文件还原两个一样的库,只是名称不一样。 转载于:https://www.cnblogs.com/Ly426/p/10209825.html

linux服务器防病毒,Linux系统中你不需要防病毒?_服务器评论-中关村在线

误区4:Linux是无病毒。Linux的安全性这么好,这是否意味着Linux是无病毒吗?现实:Linux是非常安全,并不是没有针对Linux方面的病毒。有许多针对Linux的已知病毒。但是几乎所有的已知病毒对于Linux在本质上都是非破坏性的…

python面向对象-1方法、构造函数

类是指:描述一种事物的定义,是个抽象的概念 实例指:该种事物的一个具体的个体,是具体的东西 打个比方: “人”是一个类。“张三”是人类的一个具体例子 在编程时也是同样的道理,你先自己定义一个“类”&am…

bzoj3503: [Cqoi2014]和谐矩阵

高斯消元解异或方程组。学了bitset。对比如下 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define REP(i,s,t) for(int is;i<t;i) #define dwn(i,s,t) for(int is;i>t;i--) #define clr(…

sys模块

与python解释器交互的模块 sys.argv 命令行参数List&#xff0c;第一个元素是程序本身路径 sys.exit(n) 退出程序&#xff0c;正常退出时exit(0),错误退出sys.exit(1) sys.version 获取Python解释程序的版本信息 sys.path 返回模块的搜索路径…

Oracle中SQL语句学习五(统计分组语句group by和having)

oracle&#xff08;41&#xff09; 在 应用系统开发中&#xff0c;进行需要统计数据库中的数据&#xff0c;当执行数据统计时&#xff0c;需要将表中的数据进行分组显示&#xff0c;在统计分组中是通过group by子句、分组函数、having子句共同实现的。其中group by子句用于指定…

做开发十年,我总结出了这些开发经验

本文由云社区发表,原文转载地址:https://www.cnblogs.com/qcloud1001/p/10218876.html 在一线做了十年的开发&#xff0c;经历了网易、百度、腾讯研究院、MIG 等几个地方&#xff0c;陆续做过 3D 游戏、2D 页游、浏览器、移动端翻译 app 等。 积累了一些感悟。必然有依然幼稚的…

2016年4月 TIOBE 编程语言排行榜

4月头条: Visual Basic 正在渐行渐远 COBOL, BASIC 和 FORTRAN 很长一段时间作为主力开发语言被使用。有很多软件使用这些语言来编写&#xff0c;并且发展的不亦乐乎。然而经过多年的发展&#xff0c;COBOL和FORTRAN逐渐被抛弃&#xff0c;而得益于微软的存在&#xff0c;BASIC…

基于zbus的MySQL透明代理(100行)

项目地址 https://git.oschina.net/rushmore/zbus 我们上次讲到zbus网络通讯的核心API&#xff1a; Dispatcher -- 负责-NIO网络事件Selector引擎的管理&#xff0c;对Selector引擎负载均衡 IoAdaptor -- 网络事件的处理&#xff0c;服务器与客户端共用&#xff0c;负责读写&am…

linux path环境变量起什么作用,shell基础(5)PATH环境变量的作用和使用方法

释放双眼&#xff0c;带上耳机&#xff0c;听听看~&#xff01;关于PATH的作用PATH说简单点就是一个字符串变量&#xff0c;当输入命令的时候LINUX会去查找PATH里面记录的路径。比如在根目录/下可以输入命令ls,在/usr目录下也可以输入ls,但其实ls这个命令根本不在这个两个目录下…

python3 自动打包部署war包

2019独角兽企业重金招聘Python工程师标准>>> 1 调用maven 命令打包 mvn -B -f D:/workspace/ksdcourse clean package 2 调用tomcat 部署war包 &#xff1b; 需要添加 CATALINA_HOME的环境变量 代码如下&#xff1a; #!/usr/bin/python3# -*- coding: utf-8 -*-impo…

day1作业二:多级菜单操作

作业二&#xff1a;多级菜单 &#xff08;1&#xff09;三级菜单 &#xff08;2&#xff09;可以次选择进入各子菜单 &#xff08;3&#xff09;所需新知识点&#xff1a;列表、字典 要求&#xff1a;输入back返回上一层&#xff0c;输入quit退出整个程序 思路&#xff1a; &am…

JDK源码分析(5)之 HashMap 相关

HashMap作为我们最常用的数据类型&#xff0c;当然有必要了解一下他内部是实现细节。相比于 JDK7 在JDK8 中引入了红黑树以及hash计算等方面的优化&#xff0c;使得 JDK8 中的HashMap效率要高于以往的所有版本&#xff0c;本文会详细介绍相关的优化&#xff0c;但是主要还是写 …

位运算-查找数组中唯一成对的数

基础实例一&#xff1a;使用位运算判断数的奇偶性 实例代码&#xff1a; public class Test {public static void main(String[] args) {System.out.println(isOdd(49));System.out.println(isOdd(50));}// 与运算public static boolean isOdd(int i){return (i & 1) ! 0;…