多粒度封锁-封锁粒度、多粒度封锁模式

一、引言

1、若采用封锁技术实现并发控制,事务在访问数据库对象前要在数据库对象上加锁,为提高事务的并发程度,商用DBMS会采用一种多粒度封锁方法

2、事务可访问的数据库对象可以是逻辑单元,包括关系、关系中的元组、关系的属性值或属性值集合、关系上的索引项或整个索引、甚至整个数据库等,也可以是物理单元,比如数据所占用的磁盘块 、索引所占用的磁盘块、磁盘块中的物理记录等

3、多粒度封锁技术根据封锁的数据对象的大小不同化分封锁的粒度,将锁加在不同粒度的数据库对象上。在具体DBMS应用时,实现不同的多粒度封锁模式

二、封锁粒度

1、封锁粒度:封锁单元的大小。如果封锁对象单元小,则称为细粒度,否则称为粗粒度

(1)实际应用中,通常细粒度锁是加在元组上的锁,称为元组锁,也称为行级锁

(2)粗粒度锁是加在关系上的锁,称为关系锁,也称为表级锁

对关系加上粗粒度锁后,关系中的所有元组,也被隐式地加上了同样的锁,因此,相对粗粒度锁,使用细粒度锁的事务可以只封锁事务实际访问的数据对象,事务的并发程度会更好

2、比如,对于银行业务系统

如果将账户关系表作为封锁对象,整个关系只能被一个事务加锁,由于业务系统中会有并发的许多事务,对账户表中的不同用户的信息进行更新,这些事务都需要账户关系表上的一个排他锁,那么同一时间只能有一个存款或取款业务能进行,系统中事务的并发程度会很低

 

如果将关系表中的元组作为封锁对象,对不同账户信息进行操作的事务都可以同时对账户信息进行更新

虽然使用细粒度锁使事务的并发程度更好,但由于锁的信息要占用系统的内存空间,并需要DBMS的并发控制机制花费系统时间来管理

3、因此封锁粒度的选择需同时考虑管理锁的开销事务并发度两个因素,以获得最佳的系统性能

4、为此,有的DBMS实现了多粒度封锁功能,来更好地满足应用需求和提高系统性能

(1)比如,对于需要处理大量元组的事务,可以选择关系为封锁粒度

(2)而对于只处理少量元组的用户事务,选择以元组为封锁粒度更合适

(3)也可允许事务根据操作需要来选择封锁粒度

三、多粒度封锁模式

1、不同的DBMS实现的多粒度封锁模式不同,比如SQL Server提供了如下几种锁

(1)NOLOCK锁:用于SELECT语句,读数据前不用申请数据对象上的锁

(2)TABLOCK锁:在关系表上加共享锁,在读完数据后立即释放锁

(3)HOLDLOCK保持锁:用于TABLOCK后,可将共享锁保留到事务完成,而不是读完数据立即释放锁

(4)UPDLOCK锁:在操作语句中满足条件的指定元组上加更新锁,允许对这些元组进行更新操作,其他事务可以对同一关系表中的其他元组也加更新锁,但不允许对表加共享锁和共享锁

(5)TABLOCKX锁:在关系表上加排他锁

2、该封锁模式对应的封锁策略,可用这个锁相容矩阵来描述

3、SQL Server提供在SELECT、INSERT、UPDATE和DELETE等语句中添加WITH子句来显示地进行封锁操作

SELECT SNO,GRADE
FROM SC WITH(TABLOCK)
WHERE SNO='202218014030'

4、下面我们基于创建的学生选课数据库,在SQL Server上通过两个并发事务的执行,来理解多粒度封锁技术的应用。

(1)我们通过在SQL Server的对象资源管理器上打开两个查询窗口来执行两个并发事务,请在事务的并发执行过程中并发调度中每一步的操作结果,分析操作的封锁情况以及多粒度封锁对事务的并发性和数据一致性的影响

(2)在查询窗口1开始执行事务T1,首先对关系表SC表中SNO='202218014030' 的元组进行查询,使用TABLOCK锁得到满足条件的两个元组

BEGIN TRAN T1
 SELECT SNO,GRADE
 FROM SC WITH(TABLOCK)
 WHERE SNO='202218014030';

(3)再在查询窗口2开始执行事务T2,修改学号为'202218014030'的学生的成绩为99,使用UPDLOCK锁

BEGIN TRAN T2
  UPDATE SC WITH(UPDLOCK)
  SET GRADE=99
  WHERE SNO='202218014030';

语句可以执行,说明事务T1读完数据后立刻释放了封锁

(4)返回事务T1继续运行事务,使用NOLOCK锁SC中SNO='202218014030'的元组,查询可执行,事务T1可读到事务T2修改后的数据,看到SC表中SNO='202218014030'的元组的GRADE值被更新,而事务T2没有提交,事务T1读取了脏数据

BEGIN TRAN T1
 SELECT SNO,GRADE
 FROM SC WITH(TABLOCK)
 WHERE SNO='202218014030';

 SELECT SNO,GRADE
 FROM SC WITH(NOLOCK)
 WHERE SNO='202218014030';

 (5)事务T1继续执行,使用UPDLOCK锁,修改学号为‘202218014032’的学生的成绩为96,语句可以执行,说明事务T2只在SNO='202218014030'的元组上加上了更新锁

BEGIN TRAN T1
 SELECT SNO,GRADE
 FROM SC WITH(TABLOCK)
 WHERE SNO='202218014030';

 SELECT SNO,GRADE
 FROM SC WITH(NOLOCK)
 WHERE SNO='202218014030';

 UPDATE SC WITH(UPDLOCK)
 SET GRADE=96
 WHERE SNO='202218014032';

(6)返回事务T2继续运行事务,使用TABLOCK锁,对SC表中SNO='202218014032'的元组进行查询,无结果显示,事务T2处于锁等待状态

BEGIN TRAN T2
  UPDATE SC WITH(UPDLOCK)
  SET GRADE=99
  WHERE SNO='202218014030';

  SELECT SNO,GRADE
  FROM SC WITH(TABLOCK)
  WHERE SNO='202218014032';

(7)返回事务T1提交事务,再返回事务T2可看到事务T2已执行,读取了事务T1提交后的数据,事务T2不会读取脏数据

BEGIN TRAN T1
 SELECT SNO,GRADE
 FROM SC WITH(TABLOCK)
 WHERE SNO='202218014030';

 SELECT SNO,GRADE
 FROM SC WITH(NOLOCK)
 WHERE SNO='202218014030';

 UPDATE SC WITH(UPDLOCK)
 SET GRADE=96
 WHERE SNO='202218014032';
COMMIT TRAN T1;

(8)然后回滚事务T2,对事务T2中修改的元组进行查询,可见对SC表中SNO='202218014030'的元组的修改被撤销了,而已提交的事务T1已读取了事务T2中间修改过的值,读取了脏数据

BEGIN TRAN T2
  UPDATE SC WITH(UPDLOCK)
  SET GRADE=99
  WHERE SNO='202218014030';

  SELECT SNO,GRADE
  FROM SC WITH(TABLOCK)
  WHERE SNO='202218014032';
ROLLBACK
  SELECT *
  FROM SC
  WHERE SNO='202218014030';

5、通过前面两个并发事务的执行,可以看到

(1)SELECT语句加NOLOCK锁可以使并发操作立即执行,但会读取脏数据

(2)TABLOCK锁是一个短期读锁,可以避免读脏数据

(3)UPDLOCK锁是一个长期写锁 ,是细粒度锁,元组锁

6、下面来看另一组并发事务的执行

(1)在查询窗口1开始执行事务T1,还是首先使用TABLOCK锁,对关系表SC表中SNO='202218014030'的元组进行查询,仍然得到满足条件的3个元组

BEGIN TRAN T1
 SELECT SNO,GRADE
 FROM SC WITH(TABLOCK)
 WHERE SNO='202218014030';

 

(2)在查询窗口2执行更新语句,也就是一个隐式定义的事务,使用UPDLOCK锁修改修改学号为‘202218014030’的学生的成绩为99,语句可以执行,说明事务T1在读完数据后立刻释放了封锁

UPDATE SC WITH(UPDLOCK)
  SET GRADE=99
  WHERE SNO='202218014030';

 (3)返回事务T1继续运行事务,再次执行相同的查询操作,操作可执行,得到的查询结果与前一次查询结果不一样,说明短期读锁不具有可重复读特性

BEGIN TRAN T1
 SELECT SNO,GRADE
 FROM SC WITH(TABLOCK)
 WHERE SNO='202218014030';

 SELECT SNO,GRADE
 FROM SC WITH(TABLOCK)
 WHERE SNO='202218014030';

(4)若在事务T1将TABLOCK后加保持锁,再进行查询

BEGIN TRAN T1
 SELECT SNO,GRADE
 FROM SC WITH(TABLOCK)
 WHERE SNO='202218014030';

 SELECT SNO,GRADE
 FROM SC WITH(TABLOCK)
 WHERE SNO='202218014030';
 
 SELECT SNO,GRADE
 FROM SC WITH(TABLOCK HOLDLOCK)
 WHERE SNO='202218014030';

 

(5)然后再在查询窗口2执行更新语句, 此时操作不再执行

UPDATE SC WITH(UPDLOCK)
  SET GRADE=99
  WHERE SNO='202218014030';

UPDATE SC WITH(UPDLOCK)
  SET GRADE=0
  WHERE SNO='202218014030';

(6)返回查询窗口1,在事务T1中再次执行前面的查询操作,查询结果不变,说明长期读锁具有可重复读特性

BEGIN TRAN T1
 SELECT SNO,GRADE
 FROM SC WITH(TABLOCK)
 WHERE SNO='202218014030';

 SELECT SNO,GRADE
 FROM SC WITH(TABLOCK)
 WHERE SNO='202218014030';
 
 SELECT SNO,GRADE
 FROM SC WITH(TABLOCK HOLDLOCK)
 WHERE SNO='202218014030';

 SELECT SNO,GRADE
 FROM SC WITH(TABLOCK HOLDLOCK)
 WHERE SNO='202218014030';

(7)待事务T1提交后,查询窗口2中的操作才可执行

BEGIN TRAN T1
 SELECT SNO,GRADE
 FROM SC WITH(TABLOCK)
 WHERE SNO='202218014030';

 SELECT SNO,GRADE
 FROM SC WITH(TABLOCK)
 WHERE SNO='202218014030';
 
 SELECT SNO,GRADE
 FROM SC WITH(TABLOCK HOLDLOCK)
 WHERE SNO='202218014030';

 SELECT SNO,GRADE
 FROM SC WITH(TABLOCK HOLDLOCK)
 WHERE SNO='202218014030';
COMMIT TRAN T1

 

7、通过前面两个并发事务的执行可以看到

(1)使用TABLOCK锁,事务可以避免读脏数据,但数据不具有可重复读的特性 

(2)使用HOLDLOCK锁,可使TABLOCK锁变为长期读锁,可以保证数据的可重复读特性

8、多粒度封锁的实现

(1)DBMS为实现多粒度封锁,在事务对数据对象进行显示封锁的时候,并发控制机制为了更好地解决元组锁和关系锁之间的冲突,在给元组加锁前,要给元组所在的关系加一个意向锁

(2)意向锁的作用就是标识关系中某些元组正在被锁定其他用户将要锁定关系中的某些元组

(3)意向锁是由系统隐式进行添加的,不能人为干预

(4)根据事务要对数据对象要进行的读写操作不同,意向锁也有意向共享锁(IS)意向排他锁(IX)之分

(5)意向锁之间不会产生冲突互相兼容,与共享锁和排他锁间的兼容性,可见给出的锁相容矩阵

四、小结

1、运用多粒度封锁技术提高并发事务的并发程度

2、用户利用DBMS提供的多粒度封锁模式,根据应用需求,选择封锁粒度和封锁类型,通过显示地为事务中的操作加锁,可控制事务的并发执行

3、但在事务的并发执行过程中,多粒度封锁的灵活应用,在提高事务的并发程度的同时,也会带来数据的不一致问题用户需要根据事务对并发性和数据一致性的要求合理地使用锁

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python学习笔记31:进阶篇(二十)pygame的使用之图形绘制

前言 基础模块的知识通过这么长时间的学习已经有所了解,更加深入的话需要通过完成各种项目,在这个过程中逐渐学习,成长。 我们的下一步目标是完成python crash course中的外星人入侵项目,这是一个2D游戏项目。在这之前&#xff…

Debezium报错处理系列之第111篇:Can‘t compare binlog filenames with different base names

Debezium报错处理系列之第111篇:Cant compare binlog filenames with different base names 一、完整报错二、错误原因三、解决方法Debezium从入门到精通系列之:研究Debezium技术遇到的各种错误解决方法汇总: Debezium从入门到精通系列之:百篇系列文章汇总之研究Debezium技…

论文辅助笔记:ST-LLM

1 时间嵌入 2 PFA(Partial Frozen Architecture) 3 ST_LLM 3.1 初始化 3.2 forward

蓝桥杯开发板STM32G431RBT6高阶HAL库学习FreeRtos——FreeRTOS任务调度方式

一、任务调度方式 1.1抢占式调度(不同优先级) 主要是针对优先级不同的任务,每个任务都有一个优先级, 优先级高的任务可以抢占优先级低的任务。1.2时间片调度(同优先级) 主要针对优先级相同的任务&#x…

视频技术助力智慧城市一网统管:视频资源整合与智能化管理

随着信息技术的飞速发展,智慧城市已成为现代城市发展的重要方向。在智慧城市建设中,一网统管作为城市管理的重要策略,通过整合各类信息资源,实现资源的优化配置和问题的快速响应。其中,视频技术作为一网统管场景中的关…

【Linux系统】动态库和静态库 动态库加载

认识动态库静态库 我们有没有使用过库呢?-- 用过c、c的标准库 c的各种函数,c的各种STL容器,我们使用他们内部必须得有具体实现。 Linux: .so(动态库) .a(静态库) Windows: .dll(动态库) .lib(静态库) 库是拿来给别人使用的,所…

sd调试记录:

现象:SDIO读取TF卡,1bit模式正常(一切操作都正常),4bit模式无法读取: 比如在使用函数f_opendir(&DirInf, SDPath)、f_open(&SDFile, path, FA_CREATE_ALWAYS | FA_WRITE)函数时会出现错…

局部静态变量实现的单例存在多个对象

文章目录 背景测试代码运行测试尝试打开编译器优化进一步分析 背景 业务中出现日志打印失效&#xff0c;发现是因为管理日志对象的单例在运行过程中存在了多例的情况。下面通过还原业务场景来分析该问题。 测试代码 /* A.h */ #ifndef CALSS_A #define CALSS_A#include <…

如何从 Windows 11/10/8.1/8/7 恢复已删除的视频

意外删除了视频或格式化了 SD 卡/硬盘&#xff1f;没有备份已删除的视频&#xff1f;别担心&#xff0c;我们有解决方案来恢复 Windows 11、10 中已删除的视频并处理这种糟糕的情况。 但在了解如何恢复已删除的视频和视频恢复应用程序之前&#xff0c;请知道 Windows 会为您提…

IDEA与通义灵码的智能编程之旅

1 概述 本文主要介绍在IDEA中如何安装和使用通义灵码来助力软件编程,从而提高编程效率,创造更大的个人同企业价值。 2 安装通义灵码 2.1 打开IDEA插件市场 点击IDEA的设置按钮,下拉选择Plugins,如下: 2.2 搜索通义灵码 在搜索框中输入“通义灵码”,如下: 2.3 安…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【17】认证服务01—短信/邮件/异常/MD5

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【17】认证服务01 环境搭建验证码倒计时短信服务邮件服务验证码短信形式&#xff1a;邮件形式&#xff1a; 异常机制MD5参考 环境搭建 C:\Windows\System32\drivers\etc\hosts 192.168.…

rsyslog日志转发

前言 Rsyslog可用于接受来自各种来源(本地和网络)的输入&#xff0c;转换它们&#xff0c;并将结果输出到不同&#xff08;通过模板和filter过滤&#xff09;的目的地&#xff08;目录文件中&#xff09; rsyslog是一个开源工具&#xff0c;被广泛用于Linux系统以通过TCP/UDP…

树莓派5安装冬瓜HAOS教程

原文来自瀚思彼岸和hasshome 一、安装前准备 &#xff08;1&#xff09;软件 1、树莓派烧录软件Imager 2、冬瓜HAOS镜像 &#xff08;2&#xff09;硬件 1、树莓派5 2、TF卡&#xff08;SanDisk Extreme PRO 64GB U3 A2 V30 4k&#xff09; 3、读卡器 4、键盘和鼠标 5、显…

550kg级大载重长航时无人机直升机技术详解

550kg级大载重长航时无人机直升机&#xff0c;作为一种高性能的无人机系统&#xff0c;具备了多项先进的技术特点&#xff0c;以满足高海拔、高寒等复杂环境下的应用需求。这些无人机直升机通常具备高载重、长航时、强适应性、高可靠性和良好的任务拓展性。 设备由无人直升机平…

ctfshow-web入门-文件上传(web151-web160)

目录 1、web151 2、web152 3、web153 4、web154 5、web155 6、web156 7、web157 8、web158 9、web159 10、web160 1、web151 试了下前端只能传 png 后缀的 将一句话木马改成 png 后缀&#xff0c;上传后用 burpsuite 抓包 绕过前端检测后&#xff0c;改回 php 后缀&am…

(南京观海微电子)——MOS管原理及应用区别

MOS管&#xff1a; 全称为金属氧化物半导体场效应管&#xff08;Metal Oxide Semiconductor Field Effect Transistor&#xff09;&#xff0c;也被称为MOSFET&#xff08;Metal-Oxide-Semiconductor Field-Effect Transistor&#xff09;。它是一种半导体器件&#xff0c;常用…

[数据结构] 基于选择的排序 选择排序堆排序

标题&#xff1a;[数据结构] 基于选择的排序 选择排序&&堆排序 水墨不写bug &#xff08;图片来源于网络&#xff09; 目录 &#xff08;一&#xff09;选择排序 实现&#xff1a;(默认从小到大排序) 优化后实现方法&#xff1a; &#xff08;二&#xff09;堆排序…

latex英文转中文word,及一些latex相关工具分享

前言&#xff1a;想要转换latex生成的英文pdf文件为中文word文件 一、主要步骤 1、文字翻译&#xff1a;直接使用谷歌翻译等辅助将英文翻译成中文即可&#xff1b; 2、图片&#xff1a; 使用latex时一般保存的.png&#xff0c;.bmp格式图片可以直接插入word, 但是.eps或者 .p…

基于Android Studio零食工坊

目录 项目介绍 图片展示 运行环境 获取方式 项目介绍 用户 可以浏览商品 &#xff0c; 查询商品 &#xff0c; 加入购物车 &#xff0c; 结算商品 &#xff0c; 查看浏览记录 &#xff0c; 修改密码 &#xff0c; 修改个人信息 &#xff0c; 查询订单 管理员 能够实现商品的…

AIGC专栏12——EasyAnimateV3发布详解 支持图文生视频 最大支持960x960x144帧视频生成

AIGC专栏12——EasyAnimateV3发布详解 支持图&文生视频 最大支持960x960x144帧视频生成 学习前言项目特点生成效果相关地址汇总项目主页Huggingface体验地址Modelscope体验地址源码下载地址 EasyAnimate V3详解技术储备Diffusion Transformer (DiT)Hybrid Motion ModuleU-V…