加入收藏 | 设为首页 | 会员中心 | 我要投稿 源码门户网 (https://www.92codes.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

innodb中怎么做到一个存储引擎锁

发布时间:2022-01-20 15:45:30 所属栏目:MySql教程 来源:互联网
导读:本篇文章为大家展示了innodb中怎么实现一个存储引擎锁,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 | innodb存储引擎行锁的算法 数据库对锁的使用是为了支持对共享资源进行并发的访问,提供数据的完整性和
       本篇文章为大家展示了innodb中怎么实现一个存储引擎锁,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
 
| innodb存储引擎行锁的算法
      数据库对锁的使用是为了支持对共享资源进行并发的访问,提供数据的完整性和一致性。innodb存储引擎提供了表锁、行锁和意向锁用来实现事物在不同粒度上进行上锁,从而提高数据库的并发访问,并且保证数据的完整性和一致性。
 
innodb存储引擎的锁类型
      innodb存储引擎是通过给索引上的索引项加锁来实现行锁,这种特点也就意味着,只要通过索引条件检索数据,innodb才会使用行级锁,否则会使用表锁。innodb存储引擎有以下锁类型:
 
1.共享锁和排他锁(Shared and Exclusive Locks)
2.意向锁(Intention Locks)
3.记录锁(Record Locks)
4.间隙锁(Gap Locks)
5.Next-Key Locks
6.插入意向锁(Insert Intention Locks)
7.自增锁(AUTO-INC Locks)
8.空间索引谓词锁(Predicate Locks for Spatial Indexes)
(1)共享锁和排他锁(Shared and Exclusive Locks)
innodb实现标准行级锁,其中有两种类型的锁,共享锁(S)和独占锁(X)。
1.共享锁,允许一个事务去读一行,阻止其他事务获得相同数据集的排它锁。
2.排它锁,允许获取排他锁的事务更新数据,阻止其他事务取得相同的数据集的共享读锁和排他锁。
如果事务T1持有一行记录的共享锁,那么另一个不同的事务T2对该行记录的锁定如下:
1.如果事务T2对该行的请求是一个S锁,那么事务T1和事务T2可以共同对该行记录持有同一把S锁。
2.如果事务T2对该行的请求是一个X锁,那么事务T2不可能马上获得对该行记录的X锁,必须要等到事务T1将该记录的S锁释放,才可以对该行记录持有X锁。
3.如果事务T1持有第 r 行的独占(X)锁,那么对于事务T2对该行记录的任何一种请求的锁都不能立即授予。相反,事务T2必须要等到事务T1释放在r 行上的锁。
(2)意向锁(Intention Locks)
innodb存储引擎支持多种粒度锁,允许行锁和表锁共存。为了在多个粒度级别上进行锁定,innodb存储引擎使用意向锁来实现。意向锁是表级锁,它先指明了该事物是那种类型的锁(共享锁或者独占锁),然后去锁定表中某行记录。(我们可以在后面的Gap lock 和 Next-Key Locks 的演示中MySQL 8.0 的information_schema.data_locks 表中显示的信息看到)
 
有两种类型的意向锁:
 
1.意向共享锁(IS),表明事务在一个表中的单个行上设置共享锁。
2.意向独占锁(IX),表明事务在表中的某行设置独占锁。
例如,SELECT … LOCK IN SHARE MODE 是IS,而 SELECT … FOR UPDATE 是IX锁。
意向锁的添加方式:
1.在一个事务对一张表的某行添加S锁之前,它必须对该表获取一个IS锁或者优先级更高的锁。
2.在一个事务对一张表的某行添加X锁之前,它必须对该表获取一个IX锁。

(编辑:源码门户网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!