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、锁的兼容性

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

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

  1. oracle数据库字段的值加一_天天面试--数据库乐观锁和悲观锁

    悲观锁 悲观锁(Pessimistic Lock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁.悲观锁:假 ...

  2. Java并发编程之显式锁(Lock)使用

    又是一个基于AQS好用的类,看来下次有必要看看AQS了,正好又是放假. 既然叫显式锁,必然也有隐式锁,也就是所谓的synchronzied关键字,它们两者的区别呢在于使用范围,synchronzied ...

  3. 萌新必入!手把手教你玩转Synchronized锁和Lock锁!

    文章目录 声明 前言 Synchronized锁 Lock锁 Synchronized与Lock区别 生产者与消费者问题 Synchronized Lock 8锁现象 后记 声明 1)该文章部分内容整 ...

  4. oracle内核+相克军Oracle视频 看懂绝对是高级DBA了

    相克军: 1.undo记录的不是块,而是前镜像,一条一条的,各undo块之间记录串起来,可以方便rollback 从后向前 2.undo 时,data block指向undo块的位置,为了构建CR块方 ...

  5. 查看oracle会话和进程_带有Oracle Digital Assistant和Fn Project的会话式UI。 第三部分,迁移到云...

    查看oracle会话和进程 在这篇文章中,我将继续在Oracle Digital Assistant和Oracle Digital Assistant之上为FlexDeploy实现对话式UI的故事. ...

  6. 查看oracle会话和进程_带有Oracle Digital Assistant和Fn Project的会话式UI

    查看oracle会话和进程 在这里和那里,我们看到了无数的预测,很快聊天机器人将在用户与其系统之间的通信中扮演关键角色. 我没有水晶球,也不想等待这个"很快",所以我决定现在就使这 ...

  7. 列出对象锁(lock)信息及其被杀的会话(sid,serial#)信息

    check_lock.sql脚本 列出对象锁(lock)信息及其被杀的会话(sid,serial#)信息set linesize 132 pagesize 66 break on Kill on us ...

  8. oracle对查询结果求和_oracle基础知识分享

    原文链接:https://page.om.qq.com/page/OO2PXCD6VZ6CVqLqjpU6uShg0 以下是本人整理的ORACLE学习的一些基本的语法知识,如有不对的地方,望大家批评指 ...

  9. 体验为先,博睿数据打造以用户会话为中心的监测体系

    研究发现,当页面访问性能慢一秒,其所带来的是用户满意度下降16%,相应页面访问量会下降11%,甚至包括7%转化率的下降.如果页面超过3秒无法进行正常访问,则会有57%的用户放弃浏览. 在博睿数据&qu ...

最新文章

  1. 测试驱动开发 测试前移_测试驱动开发简介
  2. mysql与ms sql server_MS SQL Server和MySQL区别
  3. go context学习
  4. Django从理论到实战(part3)--创建一个Django项目
  5. pure tornado -- table
  6. 利用display属性写的遮罩层
  7. 如何将图片一键重命名按顺序_如何“智慧”地管理文件?(一次付出,终身受益)...
  8. python常用字符串方法_python基础之字符串常用方法
  9. html em vw,rem em 与vh vw的用法简单介绍
  10. FTP客户端搭建(linux环境)
  11. AIML应答机器人(一)aiml简介
  12. 项目中涉及到金钱的计算时,数据库字段的使用
  13. Hive安装配置详解(提供实验平台)
  14. 橘子学ES10之搜索API入门
  15. ES6语法总结(21)--Generator函数的异步应用
  16. Android心跳包(一)——心跳机制
  17. RGB图像三个分量的理解和显示
  18. 壳聚苯乙烯/单分散核-壳结构/中空/介孔二氧化硅微球的研究
  19. 编译原理课后题答案 龙书 机械工业出版社
  20. [备忘]autorun专杀工具

热门文章

  1. pdf 字体和图片抽取
  2. 交通银行信息技术管理部副总经理张漫丽:交通银行“大数据+人工智能”应用研究...
  3. ThreadLocal 你到底是个什么鬼
  4. Go程序开发---Go环境配置:CentOS6.5+Go1.8标准包安装
  5. OpenSSH 密钥管理:RSA/DSA 认证(转载)
  6. 机房收费系统的合作版
  7. spoolsv.exe占cpu 99%的解决方法(转)
  8. 因果关系和相关关系 大数据_数据科学中的相关性与因果关系
  9. 蒙特卡洛模拟预测股票_使用蒙特卡洛模拟来预测极端天气事件
  10. 怎么样得到平台相关的换行符?