Python进阶篇:MySQL锁详解(篇幅较长,请耐心)

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS Agent(兼容OpenClaw),2核4GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: Python进阶篇:MySQL锁详解(篇幅较长,请耐心)Python进阶篇:MySQL锁详解(篇幅较长,请耐心)

即上篇 《Python进阶篇:MySQL隔离级别详解》 感觉有必要讲清楚mysql是如何在可重复读解决了幻读问题,这篇锁详解可以结合事务一起看。

目录
1,什么是锁?
2,InnoDB中的锁
3,锁的颗粒度与效率
4,共享锁与排他锁
4.1 共享锁
4.2 排它锁
4.3 意向共享锁(IS)/排它锁(IX)
5,记录锁,间隙锁与临键锁
5.1 锁到底锁住什么?
锁住了什么之行验证
锁住了什么之列验证
5.2 记录锁(Record Locks)
5.3 间隙锁(Gap Locks)
5.4 临键锁(Next-key Locks)
6,总结
1,什么是锁?
​ 锁是计算机解决并发情况下多线程/进程造成数据不一致问题的一种机制。通过锁来保证数据的一致性。但是锁也很大程度影响了数据库并发的效率。

2,InnoDB中的锁
​ 以下是innodb中的锁:

Shared and Exclusive Locks
Intention Locks
Record Locks
Gap Locks
Next-Key Locks
Insert Intention Locks
AUTO-INC Locks
Predicate Locks for Spatial Indexes
​ 本文主要介绍共享与排他锁(Shared and Exclusive Locks),意向锁(Intention locks),间隙锁(Gap Locks),记录锁(Record Locks),临键锁(Next-Key Locks)。

3,锁的颗粒度与效率
​ 行锁: 锁住一行记录的锁

表锁: 锁住一张表的锁

​ 效率:表>行 直接锁住整张表,干脆直接

​ 粒度:表>行 表锁住的数据资源更大

​ 冲突:表>行 表锁住的资源更大,冲突几率更大

​ 性能:表<行 冲突几率越小,并发性能更高

4,共享锁与排他锁
4.1 共享锁
​ 共享锁也叫S锁,读锁。多个事务能共享读取同一数据,但是在有事务获取到共享锁时,其它事务不能修改,从而保证了数据的一致性。 加锁的方式为在查询语句后加Lock in share mode;

​ 关闭事务自动提交,开启双窗口模拟两个事务,并进行查询。

​ 事务1加锁查询:

​ 事务2查询:

​ 事务2修改:

4.2 排它锁
​ 排它锁,也叫X锁,写锁。有事务获取了某行排它锁后,其它事务读写都将被排斥。 排他锁加锁的方式分为手动加锁和自动加锁,手动加锁的方式是在查询语句后加for update;自动加锁表示delete/update/insert语句会自动加X锁。

​ 事务1加锁:

​ 事务2操作:

4.3 意向共享锁(IS)/排它锁(IX)
​ 意向锁是表锁,由InnoDB自己维护,用户无法操作。

在假设的事务可以获得对某假定行的S 锁定之前,它必须首先获得对包含该行的表的一个IS 或者更强的锁定。

在假设的事务可以获得对某假定行的X 锁定之前,它必须首先获得对包含该行的表的一个IX 锁定。

下图是锁兼容矩阵图:

5,记录锁,间隙锁与临键锁
5.1 锁到底锁住什么?
​ 锁到底锁住了什么?是行还是列?接下来通过一系列操作来验证锁到底锁住了什么。

锁住了什么之行验证
​ 事务1给id为1的行上锁:

​ 事务2操作id为2的行:

​ 结论:锁住的不是行,那是否是列呢?

锁住了什么之列验证
​ 事务1 操作列name:

​ 事务2操作列id:

​ 结论:锁锁住的也不是列。

​ 那到底锁住了什么呢?是索引。InnoDB引擎下的所有表都有索引,如果你不创建任何索引,那么它会选择隐藏的RowID作为聚集索引。有兴趣的同学可以去验证一下。接下来要谈到的就是索引中的三种锁算法。

​ A record lock is a lock on an index record. For example, SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE; prevents any other transaction from inserting, updating, or deleting rows where the value of t.c1 is 10.

Record locks always lock index records, even if a table is defined with no indexes. For such cases, InnoDB creates a hidden clustered index and uses this index for record locking.

5.2 记录锁(Record Locks)
​ 为了更好的演示,修改了user表,并且配出主键间隙图。

​ 主键间隙图:

记录锁:在使用主键索引或者唯一索引查询时自动使用,锁住的就是where条件指定的记录行,此时该记录只能被查询,不能被修改。

事务1查询id=1:

事务2查询id=1:

5.3 间隙锁(Gap Locks)
​ 间隙锁:在操作id1-4之间空隙记录时,会在1-4加上一个间隙锁,主要的目的是为了防止其它事务在该间隙更改了数据,从而影响了数据的一致性。

​ 事务1查询不存在的记录2:

​ 事务2插入该间隙数据:

5.4 临键锁(Next-key Locks)
​ 上述记录锁在使用范围查询时则不行,而间隙锁在>=/<=这种条件下也会失效。所以将记录锁与间隙锁的锁定范围合并,就成了临建锁,临建锁在条件为范围查询时生效,临建锁是左开右闭的形式。并且在查询条件变更时会自动变成对应条件的记录锁或间隙锁。

​ 事务1开启范围查询:

此时会锁住到10这个主键,另外事务查询10会被阻塞

​ 事务2查询10:

6,总结
通过这几种锁的学习,可以明白MySQL是如何在可重复读隔离级别下是如何去解决幻读问题来保证读一致性。还有一些点就不一一详述了,有兴趣的同学可以参考:https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html#innodb-gap-locks
205/article/details/125171841

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
12月前
|
SQL AliSQL 关系型数据库
MYSQL的全局锁和表锁
本文介绍了MySQL中的锁机制,包括全局锁、表级锁及其应用场景。全局锁通过`Flush tables with read lock (FTWRL)`实现,主要用于全库逻辑备份,但会阻塞更新和结构变更操作。表级锁分为显式表锁(`lock tables`)和元数据锁(MDL),前者用于控制并发访问,后者自动加锁以确保读写正确性。文章还探讨了如何安全地为小表添加字段,建议通过设置DDL等待时间或使用MariaDB/AliSQL的NOWAIT/WAIT功能避免业务阻塞。这些方法有助于在高并发场景下优化数据库性能与安全性。
308 0
|
SQL 关系型数据库 MySQL
MySQL 锁
MySQL里常见的几种锁
319 3
|
并行计算 安全 Java
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
在Python开发中,GIL(全局解释器锁)一直备受关注。本文基于CPython解释器,探讨GIL的技术本质及其对程序性能的影响。GIL确保同一时刻只有一个线程执行代码,以保护内存管理的安全性,但也限制了多线程并行计算的效率。文章分析了GIL的必要性、局限性,并介绍了多进程、异步编程等替代方案。尽管Python 3.13计划移除GIL,但该特性至少要到2028年才会默认禁用,因此理解GIL仍至关重要。
1231 16
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
|
关系型数据库 MySQL 网络安全
如何排查和解决PHP连接数据库MYSQL失败写锁的问题
通过本文的介绍,您可以系统地了解如何排查和解决PHP连接MySQL数据库失败及写锁问题。通过检查配置、确保服务启动、调整防火墙设置和用户权限,以及识别和解决长时间运行的事务和死锁问题,可以有效地保障应用的稳定运行。
501 25
|
存储 关系型数据库 MySQL
MySQL进阶突击系列(06)MySQL有几种锁?| 别背答案,现场演示一下
本文详细解析了MySQL InnoDB存储引擎的锁机制,涵盖读锁、写锁、意向锁、记录锁、间隙锁和临键锁等8种锁类型。重点探讨了不同锁类型的加锁与释放方式,以及事务并发场景下的实战验证。通过具体示例,展示了在不同情况下锁的行为及其对事务的影响。文章还特别强调了锁的作用范围主要是索引,并解释了锁如何影响数据的读写操作。最后总结了并发事务中加锁规则,帮助读者深入理解MySQL的锁机制。
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
1348 15
|
SQL 关系型数据库 MySQL
Python中使用MySQL模糊查询的方法
本文介绍了两种使用Python进行MySQL模糊查询的方法:一是使用`pymysql`库,二是使用`mysql-connector-python`库。通过这两种方法,可以连接MySQL数据库并执行模糊查询。具体步骤包括安装库、配置数据库连接参数、编写SQL查询语句以及处理查询结果。文中详细展示了代码示例,并提供了注意事项,如替换数据库连接信息、正确使用通配符和关闭数据库连接等。确保在实际应用中注意SQL注入风险,使用参数化查询以保障安全性。
|
存储 关系型数据库 MySQL
优化 MySQL 的锁机制以提高并发性能
【10月更文挑战第16天】优化 MySQL 锁机制需要综合考虑多个因素,根据具体的应用场景和需求进行针对性的调整。通过不断地优化和改进,可以提高数据库的并发性能,提升系统的整体效率。
827 1
|
关系型数据库 MySQL 数据库
Mysql学习笔记(四):Python与Mysql交互--实现增删改查
如何使用Python与MySQL数据库进行交互,实现增删改查等基本操作的教程。
269 1
|
关系型数据库 MySQL Java
MySQL数据锁:Record Lock,Gap Lock 和 Next-Key Lock
本文基于 MySQL 8.0.30 版本及 InnoDB 引擎,深入解析三种行锁机制:记录锁(Record Lock)、间隙锁(Gap Lock)和临键锁(Next-key Lock)。记录锁锁定索引记录,确保事务唯一修改;间隙锁锁定索引间的间隙,防止新记录插入;临键锁结合两者,锁定范围并记录自身,有效避免幻读现象。通过具体示例展示了不同锁的作用机制及其在并发控制中的应用。
1508 2

推荐镜像

更多