首页 > 其他分享 >35、lock_1(表锁、事务锁)

35、lock_1(表锁、事务锁)

时间:2024-11-22 14:18:01浏览次数:1  
标签:latch 行锁 lock sp2 35 修改 tm sp1 表锁

lock锁的相关概念

oracle数据库里有一个sga,叫共享全局区(系统全局区),很多进程都可以访问;还有很多的后台进程,也可以访问部分sga区,或者全部sga区

对于同一个buffer,sp1可以访问,sp2也可以访问,这就存在一个并发的问题,所以使用锁来解决共享资源的并发问题

锁一般是个内存结构

latch

提到锁,来回顾一下latch锁;latch是个内存结构:

图解:
sp1以S的方式想遍历其中一个链,要访问数据,就要持有一个latch,然后访问链低下的sql,然后sp2以X的方式想修改同一个链,这个时候,sp2发现这个latch正被sp1所持有着,sp2就不能持有这个latch,这时候sp2就赌,sp1能很快的释放这个latch; 这时候sp2就采取措施(不排队的机制):
1、占着cpu不出来(空转着),等一段时间再来持有这个latch;(这个的前提是:sp1能在非常短的时间内释放latch的情况下)
2、再次尝试持有这个latch(在这期间可能其他进程(sp3)抢先持有,这里sp2没有排队,如果排队的话,sp2就要退出cpu),多次无法持有将释放cpu

latch和mutex的工作机制都一样(不排队)
1、如果无法持有latch,不退出cpu,随机的等待;
2、再次尝试持有(在这期间可能其他进程抢先持有,没有排队),多次无法持有将释放cpu(也就是sleep)

锁(lock)的粒度

图解:
sp1持有着一个链所对应的latch,然后找到一个buffer,找到buffer以后,就释放了latch,然后修改的瞬间pin住这个buffer,修改buffer里面的0行数据,修改完之后就释放pin锁,然后修改完之后没有提交;然后sp2修改第1行数据,虽然在数据块里面,sp1和sp2修改的两行数据在数据块的级别并没有发生冲突,oracle里面,DML的时候,加的是行锁(RX),而不是块锁,所有这里它的粒度就是行锁;只要加上行锁就是排它锁
因为持有latch,pin住一个buffer是一瞬间的事,所有sp1和sp2在latch和pin争用概率是非常小的,也就是粒度很小,产生冲突的可能性很小
然后sp1和sp2修改之后,长时间之内没有提交,没关系,因为他们是修改不同的行,只要事务不提交,行锁就一直在
对于微软的sql server来说,叫页锁

表锁(TM)

oracle数据库也可能加表锁:
一个表,有一百万行,然后sp1修改了表里面的一行,加了一个行锁(RX),事务没有提交;然后sp2过来,要drop掉这个表,删除一个表就会在表级别上加一个X锁,加了一个X锁之后,谁都不能对这个表进行任何操作了;
但是因为sp1没有提交事务,sp2就加不上tm:X锁;还有就是:sp2要加表锁,必须把表里面所有的行锁都释放了才能加上;比如这个表有一百万行,就要一行行去读,看看是不是所有的行锁都释放了,这就需要消耗很大的IO,使我们所不希望的,这时候,oracle就会做几件事:1、sp1修改表里的一行数据,加一个tm:rx表锁,2、然后再在这一行上加一个rx行锁,3、sp2想在表上加一个tm:x表锁,加不上,sp2就不能做DDL了,就能保证sp1顺利的修改完,然后commit,之后行锁和表锁就释放了

还有就是:for update一行数据,表上是tm:rs锁,行上是rx锁

1、修改一个行,就加了一个行锁tm:rx锁
2、要删除drop一个表就在表上加tm:x锁
sp1修改了一个表中的行在一个表上加tm:rx锁,未提交,sp2要drop掉了这个表,要在tm:x,sp2就加不上锁

表锁的关系(兼容性):
tm:rx和tm:x冲突
tm:rx和tm:rx是不冲突
tm:x和tm:x冲突

dml不阻塞select:就是构造CR块,虽然dml修改数据的时候,在行上加了一个行锁,但是select的时候不阻塞,oracle会读undo块,找到修改之前的数据,构造出一个CR块,然后再读取出来;
如果是select......for update(dml阻塞select......for update),这时候就会阻塞了,因为dml修改数据的时候,在行上加了一个rx行锁,for update的时候也要加上一个rx行锁,这时候就加不上了

事务锁

sp1开始一个事务(xid1),修改数据块里面的一行数据,这时候sp2也要修改同一行数据,sp2就发现,这一行上有一个锁标记(没有提交的事务),sp2就不能修改这一行了,这时候,sp2(xid2)这一个事务就跑到xid1后面排队等着,就产生一个事务锁(TX)
然后sp3也要修改这一行数据,sp3发现xid1未提交,xid2排在xid1后面,这时候,xid3就排在xid2后面,由事务等待引起的排队

锁的排队机制:

图解:
sp1以S的方式持有一个锁,sp1所在的队列叫持有者队列;然后sp2、sp3、sp4...以X的方式在等待着sp1释放锁,sp5以S的方式也持有着锁,然后sp5想把S方式转换为X方式,这时候,sp1提交了,提交以后,先考虑转换者队列,sp5就转换为X的方式持有着锁

锁的排队机制,很有可能造成数据库hang住了

标签:latch,行锁,lock,sp2,35,修改,tm,sp1,表锁
From: https://www.cnblogs.com/xgq20210831/p/18562796

相关文章

  • 瑞芯微RK3576核心板发布,全新AIoT芯片加持,革新物联体验
    深圳触觉智能SOM7608核心板现已上市,搭载瑞芯微RK3576/RK3576J高性能AIoT芯片平台,通过高速B2B连接器引出瑞芯微RK3576全部引脚资源,支持UFS2.0与eMMC5.1存储,支持全国产化。RK3576集成了四核Cortex-A72和四核Cortex-A53处理器及独立NEON协处理器,6T超高算力NPU,支持4K120FPS高帧率视频......
  • 电源模块的使用方法 IN和OUT说明 SMP15-35W系列
    电源模块的使用方法IN和OUT说明SMP15-35W系列电源是整个电路可靠工作的核心部分。由于电源电路电流及发热量大,容易出现故障。今天为大家介绍电源的使用方法,BOSHDIA电源模块将电源电路全部集成到一个很小的PCB上,从而实现输出稳定电压及大电流的模块。电源模块可直接贴装在印刷......
  • 模拟计算板卡设计方案:429-基于XC7Z035+ADS5474的2路400Msps AD 光电脉冲采集处理卡
    基于XC7Z035+ADS5474的2路400MspsAD光电脉冲采集处理卡一、板卡概述    板卡基于高速400M采样AD和ZYNQFPGA构建嵌入式的模拟计算板卡,可用于光电脉冲采集。板卡使用工业级芯片。    二、主要技术指标使用 Zynq-7000 SoC  XC7Z035对嵌入式应用进行快速原......
  • YOLOv8-ultralytics-8.2.103部分代码阅读笔记-block.py
    block.pyultralytics\nn\modules\block.py目录block.py1.所需的库和模块2.classDFL(nn.Module):3.classProto(nn.Module):4.classHGStem(nn.Module): 5.classHGBlock(nn.Module): 6.classSPP(nn.Module): 7.classSPPF(nn.Module): 8.classC1(nn.Module):......
  • Day35--抽象类
    Day35--抽象类抽象类:abstract修饰符可修饰方法和类。修饰方法则为抽象方法;修饰类则为抽象类。抽象类中可以无抽象方法,但有抽象方法的类须声明为抽象类。抽象类不能用new关键字创建对象,他是用来让子类继承的。抽象方法,只有方法的声明,没有方法的实现,他是用来让子类实现的。......
  • 35. TCP网络编程
    一、TCP协议简介1.1、什么是TCP协议  TCP协议则是建立在IP协议之上的。TCP协议负责在两台计算机之间建立可靠连接,保证数据包按顺序达到。TCP协议会通过3次握手建立可靠连接。然后需要对每个IP包进行编号,确保对方按顺序收到,如果包丢了,就自动重发。一个TCP报文来了以......
  • LeetCode235. 二叉搜索树的最近公共祖先
    题目描述:给定一个二叉搜索树,找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树T的两个结点p、q,最近公共祖先表示为一个结点x,满足x是p、q的祖先且x的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉搜索树: ......
  • Day35--static关键字详解
    Day35--static关键字详解示例:packagecom.liu.oop.demo07;//staticpublicclassStudent{privatestaticintage;//静态的变量privatedoublescore;//非静态的变量publicstaticvoidmain(String[]args){Students1=newS......
  • SY8089 兼容代替 MT3520B 5.5V、2A、2MHz,同步降压转换器
    产品描述SY8089是一种高效的,直流到直流的降压开关调节器,能够提供高达2A的输出电流。该设备的工作电压范围为从2.6V到5.5V的输入电压范围,并提供从0.6V到VIN的输出电压。在2MHz的固定频率下工作,允许使用小的外部组件,如陶瓷输入和输出帽,以及小的电感器,同时仍然提供低输出波纹。这......
  • 基于迅为RK3568开发板全国产平台,快速实现APP开机自启动技术分享
    应用场景:在一些场景中需要系统启动以后就让应用程序运行起来,如闸机打卡系统,智能点餐系统,广告机系统等等。这个需求叫做自启动。     除全国产版本核心板以外,RK3568核心板还有工业级,商业级,连接器和邮票孔多种版本。全国产版本核心板与其他版本核心板完全兼容。可以支持......