InnoDB——详细介绍行锁和意向锁以及相互关系

InnoDB作为数据库系统的关键特性,实现行级锁与意向锁,提供并发访问控制。行级锁包括共享锁和排他锁,意向锁则用于多粒度锁定,支持表级操作。文章还探讨了锁与latch的区别,以及InnoDB中的锁管理与监控。
摘要由CSDN通过智能技术生成

锁机制是数据库系统区别于文件系统的一个关键特性。

而InnoDB在锁的实现上比其他存储引擎更加高明,其实现方式非常类似于Oracle数据库。
只有真正了解这些锁的内部机制才能充分发挥InnoDB存储引擎在锁方面的优势。

本系列将详细介绍InnoDB如何对表中的数据进行锁定,以及以怎样的力度锁定数据。
人们认为行级锁总会增加开销,实际上只有当实现本身会增加开销时,行级锁才会增加开销。InnODB存储引擎不需要锁升级,因为一个锁和多个锁的开销是相同的。

什么是锁

锁是数据库系统区别于文件系统的一个关键特性。锁机制用于管理对共享资源的并发访问。

InnoDB会在行级别上对表数据上锁,同时InnoDB也会在数据库内部其他多个地方使用锁,从而允许对多种不同资源提供并发访问。例如:操作缓冲池中的LRU列表,删除、添加、移动LRU列表中的元素,为了保证一致性,必须有锁的介入。
锁提供了数据的完整性和一致性

同时,不同数据库/存储引擎的锁的实现一般是不同的。

对于SQL Server数据库,2005版本之前都是页锁,相对于MyISAM的表锁来说,并发性能有所提高。页锁更易实现,然而对于热点数据页的并发问题依然无能为力。到2005版本,SQL Server开始支持乐观并发和悲观并发。
在乐观并发下支持行锁,但是实现方式和InnoDB不同;也会存在锁升级。

InnoDB存储引擎锁的实现和Oracle数据库非常相似,提供一致性的非锁定读、行级锁支持。行级锁没有相关额外的开销,并可以同时得到并发性和一致性。

lock与latch

我们首先要区分下锁里的两个概念:lock和latch;

在数据库中,lock与latch都可以被称为“锁”。但是有不同的含义,我们主要关注的是lock。

latch一般被称为闩门(轻量级锁),因为其要求锁定的时间必须非常短

lock的对象是事务,用来锁定的是数据库中的对象,如表、页、行。并且一般lock的对象仅在事务commit或rollback后进行释放(不同的事务隔离级别释放的时间可能不同
此外,正如在大多数数据库中一样,有死锁机制

lock和latch的比较

locklatch
对象事务线程
保护数据库内容内存数据结构
持续时间整个事务过程临界资源
模式行锁、表锁、意向锁读写锁、互斥量
死锁通过waits-for graph、time out等机制进行死锁检测与处理无死锁检测与处理机制。仅通过应用程序加锁的顺序(lock leveling)保证无死锁的情况发生。
存在于Lock Manager的哈希表中每个数据结构的对象中

对于InnoDB中的latch,可以通过命令SHOW ENGINE INNODB MUTEX来进行查看。

相比于latch的查看,lock信息就显得直观多了。用户可以通过命令SHOW ENGINE INNODB STATUS 及information_schema架构下的表INNODB_TRX、INNODB_LOCKS、INNODB_LOCK_WAITS来观察锁的信息。

InnoDB中的锁

锁的类型

行锁

InnoDB实现了下面两种标准的行级锁:

  • 共享锁(S LOCK),允许事务读一行数据
  • 排他锁(X LOCK),允许事务删除或更新一行数据。

如果一个事务T1已经获得了行r 的共享锁,那么另外的事务T2可以立即获得行r的共享锁,因为读取并没有改变行r的数据,这种情况称为锁兼容(Lock Compatible)
若有其他事务T3想获取行r的排他锁,则其必须等待事务T1、T2释放行r上的共享锁,这种情况称为锁不兼容

下表展示共享锁和排他锁的兼容性:

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

注意S锁和X锁都是行锁,兼容是指对同一记录(row)锁的兼容性情况。

意向锁

此外,InnoDB支持多粒度(granular)锁定,这种锁允许事务在杭级别上的锁和表级别上的锁同时存在。为了支持在不同粒度上进行加锁操作,InnoDB存储引擎支持一种额外的锁方式,称之为意向锁(Intention Lock)

意向锁是将锁定的对象分为多个层次,意向锁意味着事务希望在更细粒度(fine granularity)上进行加锁,如下图所示:

若将上锁的对象看成一棵树,那么对最下层的对象上锁,也就是对最细粒度的对象进行上锁,那么首先需要对粗粒度的对象上锁

如果需要对页上的记录r进行上X锁,那么分别需要对数据库A、表、页上意向锁 IX,最后对记录r上X锁。若其中任何一个部分导致等待,那么该操作需要等待粗粒度的完成

用个例子来说明下,在对记录r加X锁之前,已经有事务对表1进行了S表锁,那么表1上已经存在S锁,之后事务需要对记录r在表1上加上IX,由于不兼容,所以该事务需要等待表锁操作的完成。

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

  1. 意向共享锁(IS Lock),事务想要获得一张表中某几行的共享锁
  2. 意向排他锁(IX Lock),事务想要获得一张表中某几行的排他锁

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

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

注:这里意向锁在和X/S锁讨论兼容性时,X/S为表锁;反之为行锁。

详细内容参考这里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值