innodb中怎么做到一个存储引擎锁
发布时间:2022-01-20 14:37:57 所属栏目: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锁。 (编辑:好传媒网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |