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,一经查实,立即删除!

相关文章

电线之间:采访Microsoft Edge性能PM Nolan Lawson

by Vivian Cromwell通过维维安克伦威尔(Vivian Cromwell) 电线之间:采访Microsoft Edge性能PM Nolan Lawson (Between the Wires: An interview with Microsoft Edge performance PM Nolan Lawson) I interviewed Nolan Lawson, Web Performance PM at Microsoft E…

swift菜鸟入门视频教程-09-类和结构体

本人自己录制的swift菜鸟入门,欢迎大家拍砖,有什么问题能够在这里留言。主要内容:类和结构体对照 结构体和枚举是值类型 类是引用类型 类和结构体的选择 集合(collection)类型的赋值与复制行为视频地址:百度…

oracle的集合操作符,[Oracle] Oracle的集合操作符

Oracle的集合操作包括: union , intersect , minus.[例子]假设有两个表a,b如下:SQL> select * from a;COLA----------123SQL> select * from b;COLB----------345union : 得到两个结果集的并集(不含重复值)SQL> select * from a2 union3 select * from b;COLA------…

锁大全与 GDB调试

1.innodb_lock_monitor:打开锁信息的方式 mysql> create table innodb_lock_monitor(id int) engineInnoDB; Query OK, 0 rows affected, 1 warning (2.29 sec) mysql> begin work; Query OK, 0 rows affected (0.00 sec) mysql> update t set val val 1…

[笔试面试题] 8-面向对象篇

面向对象篇 1 面向对象与面向过程的含义以及区别? 面向对象 面向对象是把数据及对数据的操作方法放在一起,作为一个相互依存的整体,即对象。对同类对象抽象出其共性,即类,类中的大多数数据,只能被本类的方法…

管理员所有权代码_为什么代码所有权糟透了,您永远不应该在有实践的地方工作...

管理员所有权代码Code ownership sucks.代码所有权糟透了。 It limits code and stunts your growth as a developer.它限制了代码并阻碍了您作为开发人员的成长。 Let’s look at what code ownership is and why it destroys individuals and organizations.让我们看看什么…

AngularJS 自定义控件

AngularJS Custom Directives 好讨厌不带日期的博客,而且说得好啰嗦 自定义指令介绍 AngularJS 指令作用是在 AngulaJS 应用中操作 Html 渲染。比如说,内插指令 ( {{ }} ), ng-repeat 指令以及 ng-if 指令。 当然你也可以实现自己的。这就是 AngularJS 所…

oracle 监听加密 tcps,通过oracle wallet配置listener tcps加密

一 配置客户端和服务端的wallet2端配置方法一致,相互添加证书orapki wallet create -wallet "/u01/oracle/wallet" -pwd Wdkf984jkkgekj434FKFD -auto_login_localorapki wallet add -wallet "/u01/oracle/wallet" -pwd Wdkf984jkkgekj434FKFD …

[财务知识] debt debit credit 的区别于联系

https://blog.csdn.net/sjpljr/article/details/70169303 剑桥词典解释分别为: Debt [C or U ] n.something, especially money, which is owed to someone else, or the state of owing something借款,欠款;债务He ran/got into debt ( borr…

SpringMVC视图解析器

SpringMVC视图解析器 前言 在前一篇博客中讲了SpringMVC的Controller控制器,在这篇博客中将接着介绍一下SpringMVC视 图解析器。当我们对SpringMVC控制的资源发起请求时,这些请求都会被SpringMVC的DispatcherServlet处理,接着 Spring会分析看…

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

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

校友邮箱_freeCodeCamp校友网络:FCC校友的自主指导网络

校友邮箱by peterWeinberg彼得温伯格 freeCodeCamp校友网络:FCC校友的自主指导网络 (The freeCodeCamp Alumni Network: A homegrown mentorship network for FCC alumni) For the last year, I’ve been spending nearly all my free time learning to code. I’v…

oracle severity,ORACLE10G如何清除OEM下的历史警告信息

ORACLE10G如何清除OEM下的历史警告信息问题描述:OEM的HOME页面可以显示ORACLE的报警信息,但报警事件清除后该信息不会自动清除。随着时间的增长,信息量逐渐加大,解决方法是手工予以清除。SampleCluster DatabaseTablespaces FullT…

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

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

Oracle数据库备份恢复,巡检须要关注的对象设置以及相关恢复概述

数据库备份恢复。巡检须要关注的对象设置: 1.数据库名称,以及DBID; --dbid在v$database中 SYSORCL>select dbid,name from v$database; DBID NAME ---------- --------- 1385095721 ORCL 2.控制文件的位置; s…

Python迭代器

一、文件迭代器 readline()每次读取文件的一行,每次调用readline方法会自动到下一行,到文件末尾时,会返回空字符串。 _next_()方法同readline()一样,只是到最后一行会引发stopiterat…

成千上万的在线课程时,如何保持理智和学习编码

by Travis Chan通过特拉维斯陈 成千上万的在线课程时,如何保持理智和学习编码 (How to stay sane and learn to code when there are thousands of online courses) We live in the information age. Information about anything we can think of is accessible to…

oracle中noguarantee,聊聊UNDO_RETENTION作用(修改guarantee)

oracle10g中,针对dba_tablespace,加了其中一个额外列是retention.回忆一下Oracle 10g之前,在自动Undo管理的模式下,我们都知道undo_retention参数的作用是用来控制当transaction被commit之后,undo信息的保留时间。这些undo信息可以…

【Hankson 的趣味题】

可能我只适合这道题的50分 但还是要争取一下的 我们知道对于\(gcd\)和\(lcm\)有这样的定义 \(a\prod _{i1}^{\pi(a)}p_i^{d_{i}}\) \(b\prod _{i1}^{\pi(b)}p_i^{g_{i}}\) 那么则有 \(gcd(a,b)\prod_{i1}^{\pi(max(a,b))} p_i^{min(g_i,d_i)}\) \(lcm(a,b)\prod_{i1}^{\pi(max(…

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

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