Mysql锁专题:InnoDB锁概述(二)

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: Mysql锁专题:InnoDB锁概述(二)

三、 InnodDB行锁实现方式



InnoDB行锁是通过给索引上的索引项加锁来实现的。这一点Mysql和Oracle不同,Oracle是通过直接在数据块中对相应数据行加锁来实现的。


InnoDB的这种特性意味着:只有通过索引条件检索数据,InnoDB才使用行级锁;否则InnoDB将使用表锁。


1)非索引字段加锁变成表锁


表20-9 InnoDB存储引擎的表在不使用索引时使用表锁例子

注意,对于表没有加索引,线程A仅要求获取id=1的记录的独占锁,但是因为没有加索引,所以该语句锁住了整个表,使用了表锁。


当我们对id行添加索引


alter table tab_with_index add index id(id);


则会有下面的例子:


2)相同索引键导致阻塞


由于Mysql的行锁是针对索引加的锁,而不是针对记录加的,所以即使是访问不同行,但是如果使用了相同的索引键,依然会冲突:


mysql> select * from tab_with_index where id = 1;
±-----±-----+
| id | name |
±-----±-----+
| 1 | 1 |
| 1 | 4 |
±-----±-----+


例如对于上表,如果对id加了索引,但是有两个记录的id相同,也就是索引相同。此时两个线程分别试图获取两个记录的独占锁依然会导致阻塞,因为mysql的行锁是加在索引上的。


3)不同索引键指向同一行记录也会导致阻塞


mysql> alter table tab_with_index add index name(name);

alter table tab_with_index add index id(id);


假设我们分别对id和name增加索引,那么不管是什么索引,InnoDB都会使用行锁来锁定不同的行。


aHR0cDovL3d3dy5waWFuc2hlbi5jb20vaW1hZ2VzLzI2MS80YzZjOWQ1YjhmMzJmNzFhZTJkNzU5OWEzN2IzYmM3NS5wbmc.png


如果是不同的索引,但是指向了同一条记录,那么依然会导致阻塞。

我的理解是不同索引最后指向了同一条主键id,锁住了注解id,故依然会阻塞,应该不是锁住记录。


4)间隙锁


当我们使用范围条件而不是相等条件来检索数据,并请求共享或排他锁时,InnoDB会给所有符合条件的已有数据记录的索引加锁;对于键值在条件范围内但是并不存在的记录,叫做间隙gap,InnoDB也会对这些间隙加锁。这种锁机制就是间隙锁。


举例来说,假如emp表中只有101条记录,其empid的值分别是 1,2,…,100,101,下面的SQL:

Select * from emp where empid > 100 for update;

这是一个范围条件的检索,InnoDB不仅会对empid为101的记录加锁,对于大于101的不存在间隙也会加锁。


**Mysql使用间隙锁的目的是防止幻读(应该只是一部分满足,不能完全回避),以满足相关隔离级别的要求。**比如对于上面的情况,如果不加锁,那么其他事务插入了empid为102的记录,则会导致本事务内再次执行上述语句时得到empid为102的记录,也就导致了幻读。另一方面,也是为了满足其回复和复制的需要。


因此,在使用范围条件检索并锁定记录时,InnoDB的这种间隙加锁机制会阻塞符合条件范围内键值的并发插入,从而导致严重的锁等待。因此,对于并发插入较多的应用,我们要尽量优化业务逻辑,尽量用相等条件来访问更新数据,避免使用范围条件。


还要特别说明的是,InnoDB除了通过范围条件加锁时使用间隙锁外,如果使用相等条件请求给一个不存在的记录加锁,InnoDB也会使用间隙锁!


aHR0cDovL3d3dy5waWFuc2hlbi5jb20vaW1hZ2VzLzc4Mi80NzljYzJlN2I4NzdiNGM2ZDEzYjQwZjYzZDBmY2RiZS5wbmc.png


5)关于恢复和复制的需要,对InnoDB锁机制的影响


Mysql通过BINLog记录执行成功的INSERT、UPDATE、DELETE等更新数据的SQL语句,并由此实现MySQL数据库的回复和主从复制。Mysql的恢复记录(复制实际就是在Slave Mysql不断的做基于BINLOG的恢复)有以下特点:


一是MySQL的恢复是SQL语句级的,也就是重新执行BINLOG中的SQL语句。

二是MySQL的Binlog是按照事务提交的先后顺序记录的,恢复也是按这个顺序进行的。


**根据上述的特点,Mysql的恢复机制要求:在一个事务未提交前,其他并发事务不能插入满足其锁定条件的任何记录,也就是不允许出现幻读。****这已经超过了ISO/ANSI SQL92“可重复读”隔离级别的要求,实际上是要求事务要串行化。这也是许多情况下,InnoDB要用到间隙锁的原因。**比如在用范围条件更新记录时,无论是Read Commited还是Repeatable Read隔离级别,InnoDB都要使用间隙锁,这并不是隔离级别的要求,而是由于Mysql恢复和复制的要求。


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
9月前
|
存储 网络协议 关系型数据库
MySQL8.4创建keyring给InnoDB表进行静态数据加密
MySQL8.4创建keyring给InnoDB表进行静态数据加密
335 1
|
8月前
|
SQL AliSQL 关系型数据库
MYSQL的全局锁和表锁
本文介绍了MySQL中的锁机制,包括全局锁、表级锁及其应用场景。全局锁通过`Flush tables with read lock (FTWRL)`实现,主要用于全库逻辑备份,但会阻塞更新和结构变更操作。表级锁分为显式表锁(`lock tables`)和元数据锁(MDL),前者用于控制并发访问,后者自动加锁以确保读写正确性。文章还探讨了如何安全地为小表添加字段,建议通过设置DDL等待时间或使用MariaDB/AliSQL的NOWAIT/WAIT功能避免业务阻塞。这些方法有助于在高并发场景下优化数据库性能与安全性。
212 0
|
4月前
|
存储 关系型数据库 MySQL
介绍MySQL的InnoDB引擎特性
总结而言 , Inno DB 引搞 是 MySQL 中 高 性 能 , 高 可靠 的 存 储选项 , 宽泛 应用于要求强 复杂交易处理场景 。
179 15
|
5月前
|
存储 安全 关系型数据库
MySQL数据库约束条件概述及其重要性讨论。
正确地实现并管理好各类紧缩条件将直接影响到企业信息管理水平与服务质量,在当今大数据背景下更显得格外重要;任何设计师都需要深刻理解其原理与运作机晰承担起责任使得所托管资料安全稳固同时又具备良好伸缩灵活度迎合日益复杂商务需求变动.
197 11
|
11月前
|
关系型数据库 MySQL 网络安全
如何排查和解决PHP连接数据库MYSQL失败写锁的问题
通过本文的介绍,您可以系统地了解如何排查和解决PHP连接MySQL数据库失败及写锁问题。通过检查配置、确保服务启动、调整防火墙设置和用户权限,以及识别和解决长时间运行的事务和死锁问题,可以有效地保障应用的稳定运行。
427 25
|
9月前
|
SQL 缓存 关系型数据库
使用温InnoDB缓冲池启动MySQL测试
使用温InnoDB缓冲池启动MySQL测试
173 0
|
4月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
184 3
|
4月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
4月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
883 152
|
4月前
|
关系型数据库 MySQL 分布式数据库
阿里云PolarDB云原生数据库收费价格:MySQL和PostgreSQL详细介绍
阿里云PolarDB兼容MySQL、PostgreSQL及Oracle语法,支持集中式与分布式架构。标准版2核4G年费1116元起,企业版最高性能达4核16G,支持HTAP与多级高可用,广泛应用于金融、政务、互联网等领域,TCO成本降低50%。

推荐镜像

更多