位置: 编程技术 - 正文

简单介绍SQL Server里的闩锁(简单介绍清明上河图)

编辑:rootadmin

推荐整理分享简单介绍SQL Server里的闩锁(简单介绍清明上河图),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:简单介绍春节的风俗,简单介绍蚂蚁的特点,简单介绍自己的句子,简单介绍春节的风俗,简单介绍一下自己,简单介绍自己的名字由来,简单介绍一下自己,简单介绍春节的风俗,内容如对您有帮助,希望把文章链接给更多的朋友!

在今天的文章里我想谈下SQL Server使用的更高级的,轻量级的同步对象:闩锁(Latch)。闩锁是SQL Server存储引擎使用轻量级同步对象,用来保护多线程访问内存内结构。文章的第1部分我会介绍SQL Server里为什么需要闩锁,在第2部分我会给你介绍各个闩锁类型,还有你如何能对它们进行故障排除。

为什么我们需要闩锁?闩锁首次在SQL Server 7.0里引入,同时微软首次引入了行级别锁(row-level locking)。对于行级别锁引入闩锁的概念是非常重要的,不然的话在内存中会出现丢失更新(Lost Updates)的现象。如我所说的,闩锁是存储引擎使用的轻量级同步对象,是SQL Server用来保护内存结构的。闩锁只不过是类似于多线程编程里的所谓的临界区(Critcal Section)概念。

在传统并发编程里,临界区是同时只能一个线程运行的代码。闩锁本身是个临界区的特殊版本,因为它允许多个并发读操作。在SQL Server的上下文里这意味着多个线程可以并发读取一个共享数据结构,例如内存中的页,但是写入共享数据结构必须是单个线程进行。

闩锁是用来协调数据库里多个线程物理执行,然而锁是基于选择的事务隔离级别,用来逻辑获得需要的隔离级别。作为开发者或DBA的你,你可以用不同方式影响锁——例如通过SQL Server里的隔离级别,或者通过各种可用锁提示。另一方面闩锁是不能以直接方式控制的。在SQL Server里没有闩锁提示,也没有可用闩锁隔离级别。下表是锁和闩锁之间的比较:

         锁(Locks)         闩锁(Latches)

控制……       事务              线程保护……     数据库内容          内存中数据结构模式……     共享的(Shared),      保持(Keep),         更新(Update),       共享的(Shared),

         排它的(Exclusive),     更新(Update),排它的(Exclusive),

         意向的(Intension)      销毁(Destroy)

死锁……  检测并解决(detection&resolution)  通过严谨代码来避免保持在……  锁管理器的哈希表(Hashtable)   保护的数据结构(Protected Data Structure)从表里可以看到,闩锁支持更细粒度保持(Keep)和销毁(Destroy)模式。保持闩锁主要用来引用计数,例如当你想知道在指定闩锁上有多少其它闩锁在等待。销毁闩锁是最有限制的一个(它甚至会阻塞保持闩锁),当闩锁被销毁时会用到,例如当惰性写入器(Lazy Writer)想要释放内存中的页时。我们先介绍下各种闩锁模式,然后说下各个闩锁模式的兼容性。

NL(空闩锁):

内部 未使用

KP(保持闩锁):

可以由多个任务同时持有 只被一个DT模式的闩锁阻塞

SH(共享闩锁):

读取数据页的时候使用 可以由多个任务同事持有 阻塞EX模式和DT模式的闩锁

UP(更新闩锁):

写入系统分配页面和tempdb的行版本化页面时使用 一个这种模式的闩锁只能被一个单独的任务持有

EX(排它闩锁):

写入数据页的时候使用 一个这种模式的闩锁只能被一个单独的任务持有

简单介绍SQL Server里的闩锁(简单介绍清明上河图)

DT(销毁闩锁):

很少使用 一个这种模式的闩锁只能被一个单独的任务持有

Notice: Undefined index: CMSdown in /data/webroot/gcms/lib/Api/Open/Article.php on line img////_dfea.png" alt="查看图片" />

在SQL Server里,一致性不能只用锁来获得。SQL Server还是可以访问没被锁管理器保护的共享数据结构,例如页头。还有SQL Server基于闩锁基础的其他组件也是,有单线程代码路径。好了,我们继续讲解SQL Server里的各种闩锁类型,还有如何对它们进行故障排除。

闩锁类型与故障排除SQL Server区分3个不同闩锁类别

IO闩锁 缓冲区闩锁(BUF) 非缓冲区闩锁(Non-BUF)

我们来详细看下这3个不同类别。当在缓冲池的页读写操作未完成——即当你读自/写入你的存储子系统时(2者未同步),SQL Server会使用IO闩锁(I/O Latches)。对于这些I/O闩锁,SQL Server在统计信息里以PAGEIOLATCH_为前缀出现。你可以在DMV sys.dm_os_wait_stats 查看下这些闩锁类型的等待。

Notice: Undefined index: CMSdown in /data/webroot/gcms/lib/Api/Open/Article.php on line img////_de.png" alt="查看图片" />

使用这些闩锁,SQL Server保证那些页不会并发多次读入缓存池,那些页也不会从缓存池忽略,在那些页需要被查询访问的时候。

除这些I/O闩锁外,SQL Server也支持所谓的缓存区闩锁(Buffer Latches),它用来保护缓冲池里页不会被并发运行的线程影响。这些闩锁,SQL Server使用它们来阻止内存中的丢失更新(Lost Updates)。没有这类闩锁,在缓存池里会有并发的读写页,它们会引发主内存里页的损坏。对于这些缓存闩锁,SQL Server在统计信息里以PAGELATCH_为前缀出现。你可以在DMV sys.dm_os_wait_stats 查看下这些闩锁类型的等待。这里最重要的是你涉及了主内存的竞争,因为他们的等待类型名称里不包含IO字样。

Notice: Undefined index: CMSdown in /data/webroot/gcms/lib/Api/Open/Article.php on line img////_df1e1f.png" alt="查看图片" />

最后SQL Server内部使用所谓的非缓存区闩锁(Non-Buffer Latches)来保护除缓冲池外的共享数据结构。对于这些非缓存闩锁,SQL Server在统计信息里以LATCH_为前缀出现。你可以在DMV sys.dm_os_wait_stats 查看下这些闩锁类型的等待。

Notice: Undefined index: CMSdown in /data/webroot/gcms/lib/Api/Open/Article.php on line img////_d.png" alt="查看图片" />

但在这个DMV里这些对于非缓存区闩锁的等待只是SQL Server内部使用的各个闩锁的概况信息,你可以在单独的DMV sys.dm_os_latch_stats找到更详细的信息。

Notice: Undefined index: CMSdown in /data/webroot/gcms/lib/Api/Open/Article.php on line img////_dff.png" alt="查看图片" />

SQL Server 内部使用个闩锁来同步共享数据结构的访问。其中一个著名的闩锁是FGCB_ADD_REMOVE,它用来保护文件组的文件组控制阻塞( File Group Control Block (FGCB)),在以下特定操作期间:

文件增长(手动或自动) 增加/删除文件组文件 重新计算填充比重(Recalculating proportional fill weightings) 在循环分配期间,通过文件组的文件回收。当你看到这个闩锁排在前列是,你肯定有太多自动增长操作的问题,原因是你数据库糟糕的默认配置。当查询尝试读/写保护的数据结构且需要等待一个闩锁时,查询就会进入挂起状态,直到闩锁可以成功获取。因此查询经过的整个查询生命周期包括运行(RUNNING),挂起(SUSPENDED),可运行(RUNNABLE),最后再次运行(RUNNING)。因此,当查询长时间把持闩锁时,强制共享数据结构保护才有意义。那是因为改变查询状态也意味着进行Windows系统里的上下文切换,依据引入的CPU周期是个很昂贵的操作。

因此对于读写频繁或极短时间内的共享数据结构上放上闩锁没有意义。在这个情况下,需要的上下文切换会杀死SQL Server的整体性能,它需要花费太多的时间来完成整个查询生命周期(运行(RUNNING),挂起(SUSPENDED),可运行(RUNNABLE))。那就是是SQL Server引入的所谓自旋锁(Spinlocks)。锁管理器就是这样数据结构的好例子:当锁定或解锁数据对象(例如记录,页等)时只需要单个线程访问。但当你查看sys.dm_os_latch_stats时,你会发现没有闩锁保护锁管理器本身。锁管理器使用的哈希表里对应的哈希桶使用自旋锁来保护——LOCK_HASH自旋锁。通过锁管理器执行锁定和解锁操作前,必须获得自旋锁。

标签: 简单介绍清明上河图

本文链接地址:https://www.jiuchutong.com/biancheng/347419.html 转载请保留说明!

上一篇:简单介绍SQL Server中的自旋锁(简单介绍春节的风俗)

下一篇:为什么我们需要在SQL Server里更新锁(为什么我们需要政府)

  • 总账会计的职责目标设定
  • 生产成本年末转入什么科目
  • 企业以买一赠一
  • 合营企业和联营企业会计核算
  • 股权投资公司属于金融企业吗
  • 出口未开票怎么会计处理
  • 电子版发票怎么弄
  • 承兑到期没兑现怎么处理
  • 小企业净资产收益率
  • 办公场所转租赁需要交哪些税费
  • 固定资产的知识
  • 资产减值准备是
  • 个税手续费退还时间
  • 营业执照首次年报
  • 生活用品发票可以报销吗
  • 怎么看是不是专用发票
  • 外经证金额没开完需要核销吗
  • 自然人税收管理系统扣缴客户端app
  • 因腐败因素形成的损失企业所得税如何处理?
  • 公允出资税务处理怎么做?
  • 公司收到银行存款利息收入会计分录
  • 联想笔记本e49系列哪款好
  • 出口退税的条件包括
  • php值传递和引用传递 原理
  • 系统之家哪个系统比较好用
  • 发票明细与实际不符是什么行为
  • PHP:Memcached::deleteByKey()的用法_Memcached类
  • 深度学习模型精度fp16和fp32
  • php如何运行脚本
  • 图文详解:台盆柜安装的全过程
  • 罚款在企业所得税前可以扣除吗
  • 待报解预算收入什么意思
  • cakephp菜鸟教程
  • 应收贷方有余额怎么调整
  • 以旧换新方式销售金银首饰的消费税处理
  • 临时设施账务处理分录
  • 企业都有哪些资质
  • 公司股票买卖账务处理
  • sqlsever日志在哪儿
  • 无法支付的应付账款转作营业外收入
  • 员工高铁票能抵扣吗
  • 科技经费使用
  • SQL Server 2012 FileTable 新特性详解
  • sqlserver2008连接
  • 长期股权投资减值准备是什么科目
  • 应交税费明细科目设置最新
  • 税控盘的费用做什么会计科目
  • 不动产租赁可以享受加计抵减吗
  • 营业执照注销对商标有影响吗?
  • 旅行社开具的发票
  • 提的税与实际交的税区别
  • 房地产企业土地增值税预缴
  • 抵账房买卖流程
  • 政府对失业人员补贴
  • 公司缴纳印花税如何缴纳
  • 股东借款可以直接转为实缴出资吗
  • 营改增 交通运输
  • 什么是增值税
  • win7系统开机后黑屏只有鼠标指针可以移动
  • 这张图告诉我们什么道理
  • ubuntu系统安装SSH服务
  • xp死机不动
  • linux find命令查找文件 name
  • win7桌面文件夹路径
  • 延长药品使用时间的方法
  • win10系统微软账户密码忘了
  • 事件委托机制的三个主要组件
  • 如何短时间内学会打字
  • 记录心率
  • js类的使用
  • python里的lambda怎么用
  • 北京国税地税合并
  • 2023年内蒙古房贷利率
  • 内蒙古网上税务登记流程
  • 宁波市开发区
  • 企业职工病退后一般能领多少钱
  • 期房交了契税就可以拿房产证了吗
  • 输入税控盘密码是填证书口令吗
  • 船舶吨税的税目
  • 浙江省网上税务局总分机构变更流程
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设