KES数据库意向锁介绍

本文详细阐述了意向锁的概念、在数据库事务中的作用,比较了表级锁与行级锁的特点,并解释了意向锁如何支持表锁和行锁的共存,以及其在避免死锁和提高并发性能中的关键角色。
摘要由CSDN通过智能技术生成

关键字:意向锁;并发;事务

1.概念

锁的概念:为了事务和事务之间相互不影响而进化出来的功能。

在某个事务操作数据之前,就为数据加上一把锁,防止其他事务同时操作,在操作完成之后会将锁释放,以便其他事务再次进行上锁执行,在不同的存储引擎中,锁功能并不相同。

LOCK_IS、LOCK_IX意向锁也叫IS共享意向锁、IX独占意向锁

意向锁在上锁时,需要在数据所在表上做一个标记,表示该表已经被加锁了,因此其他事务在为这个表加锁前,就不需要遍历每一条数据中是否有锁,而只需要看一下表的意向锁即可,大大提高了锁判断的效率。

比如:MyISAM存储引擎采用的是表级锁,innoDB存储引擎既支持行级锁,也支持表级锁,默认情况下采用表级锁。

特点比较:

1、表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。

2、行级锁:开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率最低,并发度也最高。

3、页面锁:开销和加锁时间介于表锁和行锁之间,会出现死锁,锁定粒度介于表锁和行锁之间,并发度一般。
意向锁的主要功能就是:避免为了判断表是否存在行锁而去扫描全表。


2.意向锁的使用

意向锁(Intent Lock)是一种数据库锁定机制,用于协调事务对数据库对象的并发访问。它主要用于指示一个事务将要锁定一个资源,并且还会指示其他事务对同一资源进行更粗粒度的锁定。

意向锁本身并不直接锁定数据对象,而是用于表示事务所需的锁定级别,以协调并发事务对数据库对象的访问。通过使用意向锁,可以实现多个事务之间的共享和排他锁的协同工作,从而更有效地管理并发访问。

在意向锁的层次结构中,有两种类型的锁定级别:意向共享锁(Intent Shared Lock,简称IS):表明事务将要获取一个共享锁。多个IS锁可以共存,即多个事务可以共享相同的资源。意向排他锁(Intent Exclusive Lock,简称IX):表明事务将要获取一个排他锁。一个IX锁与多个IS锁是互斥的,即只有一个事务可以获取到IX锁。

通过使用意向锁,数据库管理系统可以更好地掌握各个事务对数据库对象的锁定情况,避免发生死锁等并发问题。

例子:事务A修改user表的记录r,会给记录r上一把行级的排他锁(X),同时会给user表上一把意向排他锁(IX),这时事务B要给user表上一个表级的排他锁就会被阻塞。意向锁通过这种方式实现了行锁和表锁共存且满足事务隔离性的要求。

question1:为什么意向锁是表级锁呢?

当我们需要加一个排他锁时,需要根据意向锁去判断表中有没有数据行被锁定(行锁);

(1)如果意向锁是行锁,则需要遍历每一行数据去确认;

(2)如果意向锁是表锁,则只需要判断一次即可知道有没数据行被锁定,提升性能。

question2:意向锁怎么支持表锁和行锁并存?

(1)首先明确并存的概念是指数据库同时支持表、行锁,而不是任何情况都支持一个表中同时有一个事务A持有行锁、又有一个事务B持有表锁,因为表一旦被上了一个表级的写锁,肯定不能再上一个行级的锁。

(2)如果事务A对某一行上锁,其他事务就不可能修改这一行。这与“事务B锁住整个表就能修改表中的任意一行”形成了冲突。所以,没有意向锁的时候,让行锁与表锁共存,就会带来很多问题。于是有了意向锁的出现,如question1的答案中,数据库不需要在检查每一行数据是否有锁,而是直接判断一次意向锁是否存在即可,能提升很多性能。

1、意向锁相互兼容,因为IX、IS只是表明申请更低层次级别元素(比如 page、记录)的X、S操作。

2、表级S锁和X、IX锁不兼容:因为上了表级S锁后,不允许其他事务再加X锁。

3、表级X锁和 IS、IX、S、X不兼容:因为上了表级X锁后,会修改数据,所以即使是行级排他锁,因为表级锁定的行肯定包括行级锁定的行,所以表级X和IX、X都不兼容。

注意:上了行级X锁后,行级X锁不会因为有别的事务上了IX而堵塞,一个mysql是允许多个行级X锁同时存在的,只要他们不是针对相同的数据行。


场景举例(假设此时没有意向锁):假设事务A锁住了表中的一行记录,之后,事务B申请整个表的写锁。数据库需要避免这种冲突,需要让B的申请被阻塞,直到A释放了行锁。数据库要怎么判断这个冲突呢?

方式1):判断表中的每一行是否已被行锁锁住(效率非常低)

方式2):直接判断整表是否已被其他事务用表锁锁表

意向锁就是在这个时候发挥作用的,有了意向锁。在意向锁存在的情况下,事务A必须先申请表的意向共享锁(表级锁),成功后再申请一行的行锁。下次事务B去申请表的排它锁时,发现有意向共享锁,说明表中肯定有某些行被锁住了,事务B将会阻塞;

当我们需要加一个排他锁时,需要根据意向锁去判断表中有没有数据行被锁定;

(1)如果意向锁是行锁,则需要遍历每一行数据去确认;

(2)如果意向锁是表锁,则只需要判断一次即可知道有没数据行被锁定,提升性能。

因此,意向锁是表级别的。

意向锁与X/S锁之间的关系:事务A在锁定一行记录时,会先加上意向锁(表级别),之后事务B申请整个表的排它锁时,先加上意向排它锁,发现该表已经被加上意向锁了,但是意向锁之间是兼容的,可以申请成功,之后事务B尝试申请表级别排它锁,申请锁失败,被阻塞;因为表级别的排它锁和意向锁是冲突的。

意向锁和行级S/X锁是兼容的,并且所有的意向锁直接都是兼容的。

排他共享锁指的都是表锁!意向锁不会与行级的共享排他锁互斥,上了行级X锁后,行级X锁不会因为有别的事务上了IX而堵塞,一个mysql是允许多个行级X锁同时存在的,只要他们不是针对相同的数据行。


当第一个进程commit之后释放了意向锁,第二个进程将取消阻塞,才能获得意向排他锁。

意向共享锁是相互兼容的,意向排他锁是互斥的。意向锁本身不直接锁定数据对象,而是用于表示事务所需的锁定级别,以协调并发事务对数据库对象的访问。

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值