首页 > 数据库 >数据库之锁

数据库之锁

时间:2024-07-12 14:57:42浏览次数:17  
标签:之锁 Lock 数据库 事务 兼容 死锁 InnoDB 锁定

目录

一、简述数据库的锁

二、简述间隙锁

三、InnoDB中的行级锁是如何实现的

四、数据库在什么情况下会发生死锁

五、简述数据库死锁的解决办法


一、简述数据库的锁

        锁是数据库系统区别于文件系统的一个关键特性,锁机制用于管理对共享资源的并发访问。下面我们以MySQL数据库的InnoDB引擎为例,简单介绍一下锁的特点。

        如果一个事务T1已经获得了行r的共享锁,那么另外的事务T2可以立即获得行r的共享锁,因为读取并没有改变行r的数据,称这种情况为锁兼容。但若有其它的事务T3想获得行r的排它锁,则其必须等待事务T1、T2释放行r上的共享锁,这种情况称为锁不兼容。下图显示了共享锁和排它锁的兼容性,可以发现X锁与任何的锁都不兼容,而S锁仅和S锁兼容。需要特别注意的是,S锁和X锁都是行锁,兼容是指对同一记录(row)锁的兼容性情况。

XS
X不兼容不兼容
S不兼容兼容

        锁的粒度:InnoDB存储引擎支持多粒度锁定,这种锁定允许事务在行级上的锁和表级上的锁同时存在。为了支持在不同粒度上进行加锁操作,InnoDB存储引擎支持一种额外的锁方式,称之为意向锁。意向锁是将锁定的对象分为多个层次,意向锁意味着事务希望在更细粒度上进行加锁。

        InnoDB存储引擎支持意向锁设计比较简练,其意向锁即为表级别的锁。设计目的主要是为了在一个事务中揭示下一行被请求的锁类型。其支持两种意向锁:

        1、意向共享锁(IS Lock),事务想要获得一张表中某几行的共享锁。

        2、意向排它锁(IX Lock),事务想要获得一张表中某几行的排它锁。

        由于InnoDB存储引擎支持的是行级别的锁,因此意向锁其实不会阻塞除全表扫以外的任何请求。所以表级意向锁与行级锁的兼容性如下所示:

ISIXSX
IS兼容兼容兼容不兼容
IX兼容兼容不兼容不兼容
S兼容不兼容兼容不兼容
X不兼容不兼容不兼容不兼容

        锁的算法:InnoDB存储引擎有3种行锁的算法,其分别是:

        1、Record Lock:单个行记录上的锁。

        2、Gap Lock:间隙锁,锁定

        3、Next-Key Lock:Gap Lock+Record Lock,锁定一个范围,并且锁定记录本身。

        Record Lock 总是会去锁住索引记录,如果InnoDB存储引擎表在建立的时候没有设置任何一个索引,那么这时InnoDB存储引擎会使用隐式的主键来进行锁定。Next-Key Lock是结合了Gap Lock和Record Lock的一种锁定算法,在Next-Key Lock算法下,InnoDB对于行的查询都是采用这种锁定算法。采用Next-Key Lock的锁定技术称为Next-Key Locking,其设计没目的是为了解决Phantom Problem(幻读)。利用这种锁定技术,锁定的不是单个值,而是一个范围,是谓词锁(Predict Lock)的一种改进。

        关于死锁:死锁是指两个或两个以上的事务在执行过程中,因争夺资源而造成的一种互相等待的现象。若无外力作用,事务将无法推进下去。

        锁升级:锁升级(Lock Escalation)是指将当前锁的粒度降低。举例来说,数据库可以把一个表的1000个行锁升级为一个页锁,或者将页锁升级为表锁。

        InnoDB存储引擎不存在锁升级的问题。因为其不是根据每个记录来产生行锁的,相反,其根据每个事务访问的每个页对锁进行管理的,采用的是位图的方式。因此不管一个事务锁住页中一个记录还是多个记录,其开销通常都是一致的。

二、简述间隙锁

        InnoDB存储引擎有3种行锁的算法,间隙锁(Gap Lock)是其中之一。间隙锁用于锁定一个范围,但不包含记录本身。它的作用是为了阻止多个事务将记录插入到同一范围内,而这会导致幻读问题的产生。

三、InnoDB中的行级锁是如何实现的

        InnoDB行级锁是通过给索引上的索引项加锁来实现的。只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁。

        当表中锁定其中的某几行时,不同的事务可以使用不同的索引锁定不同的行。另外,不论使用主键索引、唯一索引还是普通索引,InnoDB都会使用行锁来对数据加锁。

四、数据库在什么情况下会发生死锁

        死锁是指两个或两个以上的事务在执行过程中,因争夺资源而造成的一种互相等待的现象。若无外力作用,事务将无法推进下去。下表演示了死锁的一种经典情况,即A等待B、B等待A,这种死锁问题被称为AB-BA死锁

时间会话A会话B
1BEGIN:
2

mysql>SELECT * FROM t

WHERE a = 1 FOR UPDATE;

************1.row************

a:1

1 row in set(0.00sec)

BEGIN:
3

mysql>SELECT * FROM t

WHERE a = 2 FOR UPDATE;

************1.row************

a:2

1 row in set(0.00sec)

4

mysql>SELECT * FROM t

WHERE a = 2 FOR UPDATE;

 #等待

5

mysql>SELECT * FROM t

WHERE a = 1 FOR UPDATE;

   ERROR 1213(40001): Deadlock found when trying to get lock;try restarting transaction

五、简述数据库死锁的解决办法

        解决死锁问题最简单一种方法是超时,即当两个事务互相等待时,当一个等待时间超过设置的某一阈值时,其中一个事务进行回滚,另一个等待的事务就能继续进行。

        除了超时机制,当前数据库还都普遍采用wait-for graph(等待图)的方式进行死锁检测。较之超时的解决方案,这是一种更为主动的死锁检测方式。InnoDB存储引擎也采用的这种方式。wait-for graph 要求数据库保存以下两种信息:

        1、锁的信息链表;

        2、事务等待链表;

        通过以上链表可以构造出一张图,而在这个图中若存在回路,就代表存在死锁,因此资源间相互发生等待。这是一种较为主动的死锁检测机制,在每个事务请求锁并发生等待时都会判断是否存在回路,若存在则有死锁,通常来说InnoDB存储引擎选择回滚undo量最小的事务。

标签:之锁,Lock,数据库,事务,兼容,死锁,InnoDB,锁定
From: https://blog.csdn.net/L_peanut/article/details/140341458

相关文章

  • 获取数据库表格字段描述
    USE[database1]GO/******Object:StoredProcedure[dbo].[Sp_ObjItems]ScriptDate:2024/7/1213:17:42******/SETANSI_NULLSONGOSETQUOTED_IDENTIFIERONGOcreatePROCEDURE[dbo].[CheckFormDescription]--Addtheparametersforthestoredprocedur......
  • 如何使用 Unity 的 ScriptableObjects 和 Resources 系统来创建一个简易的数据库系统,
    1.引言问题:如何在Unity中存储数据?解决方案:使用ScriptableObjects和Resources系统创建一个易于使用和管理的数据库。优势:自动读写数据自动处理资源实例化和更改无需额外插件使用用户定义键进行访问可扩展性强2.实现2.1项目结构四个主要的脚本:Item......
  • DedeCMS Error Warning!连接数据库失败,可能数据库密码不对或数据库服务器出错!
    DedeCMSErrorWarning!TechnicalSupport:http://bbs.dedecms.comErrorpage:/dede/login.phpErrorinfos:DedeCms错误警告:连接数据库失败,可能数据库密码不对或数据库服务器出错!这个错误信息是来自DedeCMS的内容管理系统,提示“连接数据库失败,可能数据库密码不对或数据库服......
  • 演示:【Avalonia-Controls】Avalonia皮肤,主题,自定义控件,数据库,系统模块资源库
    一、目的:分享一个Avalonia皮肤,主题,自定义控件,数据库,系统模块资源库开源地址:GitHub-HeBianGu/Avalonia-Controls:Avalonia控件库Nuget包地址:NuGetGallery|PackagesmatchingHeBianGu.AvaloniaUI.演示视频地址:【Avalonia-Controls】Avalonia工具组件皮肤库v1.0.0_......
  • Java毕业设计基于Vue+SpringBoot的电影院订票选座管理系统(代码+数据库+文档LW+运行成
    很多朋友发现后期找不到文章,收藏关注不迷路文章目录项目介绍技术介绍项目界面关键代码目录项目介绍在飞速发展的今天,网络已成为人们重要的交流平台。电影院每天都有大量的需要通过网络发布,为此,本人开发了一个基于B/S;浏览器/服务器;模式的电影院管理系统。该系......
  • Java毕业设计基于Vue+SpringBoot的畅游游戏销售平台(代码+数据库+文档LW+运行成功)
    很多朋友发现后期找不到文章,收藏关注不迷路文章目录项目介绍技术介绍项目界面关键代码目录项目介绍近些年来,随着科技的飞速发展,互联网的普及逐渐延伸到各行各业中,给人们生活带来了十分的便利,畅游游戏销售平台利用计算机网络实现信息化管理,使整个畅游游戏销售平......
  • Java毕业设计基于Vue+SpringBoot的爱看漫画小程序(代码+数据库+文档LW+运行成功)
    很多朋友发现后期找不到文章,收藏关注不迷路文章目录项目介绍技术介绍项目界面关键代码目录项目介绍相比于以前的传统手工管理方式,智能化的管理方式可以大幅降低爱看漫画的运营人员成本,实现了爱看漫画的标准化、制度化、程序化的管理,有效地防止了爱看漫画的随意管......
  • shading-jdbc数据库读写分离
    官方文档1.ShardingSphere1.1ShardingSphere简介ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这3款相互独立的产品组成。他们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于......
  • MySQL 数据库的 DDL
    备份MySQL数据库的DDL(数据定义语言)语句包括导出数据库结构(如表、视图、触发器、存储过程和函数等),但不包括实际数据。通常使用mysqldump工具进行此类操作。以下是具体的方法:备份DDL1.导出数据库结构(不包括数据)使用mysqldump工具导出数据库结构,可以指定--no-data......
  • 一款强大的数据库提取数据工具
    原文:https://mp.weixin.qq.com/s/wou_NAYSxNXFW065VL2IBQ大家好,我是开源项目解读小编,每天分享最重要的开源项目主要分享GitHub上有趣、有意义、重要的项目Jailer可用来从生产数据库中提取出,支持测试一条完整业务线所需的数据库表和数据。源代码(中文):http://www.gitpp.com/......