MySQL隔离级别与MySQL的锁

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS Agent(兼容OpenClaw),2核4GB
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
简介: MySQL隔离级别与MySQL的锁

MySQL隔离级别


1.png


测试隔离级别


数据库准备


数据库如下图所示,所有字段都是int(方便测试),id为主键索引,name为普通索引(唯一索引),age没有索引


2.png


Read Uncommitted(读取未提交内容)


打开两个mysql终端,都设置session级别的隔离级别为读取未提交内容(本次会话有效)


set session transaction isolation level read uncommitted;


如下表所示,

事务B在第4步进行了修改(还没有提交或者回滚),

事务A在第5步就已经可以读取到修改(未提交或者回滚)的内容,出现了(脏读)

事务B在第6步回滚了, 撤销了修改操作,那么第5步读的就不正确了


微信截图_20230224150908.png


Read Committed(读取提交内容)


打开两个mysql终端,都设置session级别的隔离级别为读取提交内容(本次会话有效)


set session transaction isolation level read committed;


如下表所示,

事务B在步骤4修改了数据

事务A在步骤5读取数据,(解决了脏读问题)

事务B在步骤6提交了修改内容

事务A在步骤7读取的数据和步骤5读取的数据不一样(出现了不可重复读问题)


3.png


Repeatable Read(可重读)


打开两个mysql终端,都设置session级别的隔离级别为可重读(本次会话有效)


set session transaction isolation level  repeatable read;


下面的例子有点不恰当,下面的例子有点不恰当,下面的例子有点不恰当


如下表所示,

事务A在步骤3和步骤6读取的数据一样(解决了不可重复度)

事务B在步骤4插入主键为4的数据

事务A在步骤7插入主键为4的数据报错 (出现了幻读)


4.png


Serializable(可串行化)


打开两个mysql终端,都设置session级别的隔离级别为串行化(本次会话有效)


set session transaction isolation level  serializable;


如下表所示,


事务B在步骤5遇到了阻塞,性能差


5.png


MySQL的锁


innodb行锁,锁的是什么?


答:锁的是索引。有索引时锁索引,没有索引的时候锁表。

如下表所示,id有主键索引,name有唯一索引,age无索引


6.png


7.png


乐观锁和悲观锁


乐观锁


乐观锁与数据库无关


如下表所示,有一个字段是verison 版本号


###伪代码,无竞争逻辑
student = select * from student where id = 1;
currentVersion = student.version
update student set age = 11 , version = version + 1 where id = 1 and  version = currentVersion ;
###伪代码,有竞争逻辑
student = select * from student where id = 1;
currentVersion = student.version
//此时中间有另一个客户端又修改了这条记录,version+1了
update student set age = 11 , version = version + 1 where id = 1 and  version = currentVersion ;//这条修改失败,因为currentVersion已经过时,不存在


8.png


悲观锁


说到这里,由悲观锁涉及到的另外两个锁概念就出来了,它们就是共享锁与排它锁。共享锁和排它锁是悲观锁的不同的实现,它俩都属于悲观锁的范畴。


共享锁和排它锁


共享锁


select * from student WHERE id = 1 lock in share mode;


9..png


排它锁


增、删、改默认添加的是排它锁。


select * from student WHERE id = 1 for update;


给一条记录上了排它锁后,其他事务不能给改条记录上共享锁和排它锁。


意向锁


意向锁是表级别锁,意向锁不是人为的,是数据库自动的。


以意向排它锁为例,当事务A给记录1上锁时,先获取表的意向排它锁,然后在给记录1上锁;此时事务B给表上表锁,先获取表的意向排它锁,然后在锁表,但是此时意向排它锁在被事务A获取,所示事务B锁表失败。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
10月前
|
存储 SQL 关系型数据库
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
|
SQL AliSQL 关系型数据库
MYSQL的全局锁和表锁
本文介绍了MySQL中的锁机制,包括全局锁、表级锁及其应用场景。全局锁通过`Flush tables with read lock (FTWRL)`实现,主要用于全库逻辑备份,但会阻塞更新和结构变更操作。表级锁分为显式表锁(`lock tables`)和元数据锁(MDL),前者用于控制并发访问,后者自动加锁以确保读写正确性。文章还探讨了如何安全地为小表添加字段,建议通过设置DDL等待时间或使用MariaDB/AliSQL的NOWAIT/WAIT功能避免业务阻塞。这些方法有助于在高并发场景下优化数据库性能与安全性。
323 0
|
7月前
|
关系型数据库 MySQL 数据库
【赵渝强老师】MySQL的事务隔离级别
数据库并发访问时易引发数据不一致问题。如客户端读取到未提交的事务数据,可能导致“脏读”。MySQL通过四种事务隔离级别(读未提交、读已提交、可重复读、可序列化)控制并发行为,默认为“可重复读”,以平衡性能与数据一致性。
435 0
|
10月前
|
安全 关系型数据库 MySQL
mysql事务隔离级别
事务隔离级别用于解决脏读、不可重复读和幻读问题。不同级别在安全与性能间权衡,如SERIALIZABLE最安全但性能差,READ_UNCOMMITTED性能高但易导致数据不一致。了解各级别特性有助于合理选择以平衡并发性与数据一致性需求。
301 1
|
11月前
|
关系型数据库 MySQL 数据库
MySQL报错:未知系统变量'tx_isolation'及隔离级别查询
记住,选择合适的隔离级别,就像是在风平浪静的湖面上找到适合的划船速度——既要快到能赶上午饭(性能),又不至于翻船(数据一致性问题)。
441 3
|
SQL 安全 关系型数据库
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)
事务是MySQL中一组不可分割的操作集合,确保所有操作要么全部成功,要么全部失败。本文利用SQL演示并总结了事务操作、事务四大特性、并发事务问题、事务隔离级别。
5728 56
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)
|
SQL 关系型数据库 MySQL
京东面试:MySQL MVCC是如何实现的?如何通过MVCC实现读已提交、可重复读隔离级别的?
1.请解释什么是MVCC,它在数据库中的作用是什么? 2.在MySQL中,MVCC是如何实现的?请简述其工作原理。 3.MVCC是如何解决读-写和写-写冲突的? 4.在并发环境中,当多个事务同时读取同一行数据时,MVCC是如何保证每个事务看到的数据版本是一致的? 5.MVCC如何帮助提高数据库的并发性能?
京东面试:MySQL MVCC是如何实现的?如何通过MVCC实现读已提交、可重复读隔离级别的?
|
关系型数据库 MySQL 网络安全
如何排查和解决PHP连接数据库MYSQL失败写锁的问题
通过本文的介绍,您可以系统地了解如何排查和解决PHP连接MySQL数据库失败及写锁问题。通过检查配置、确保服务启动、调整防火墙设置和用户权限,以及识别和解决长时间运行的事务和死锁问题,可以有效地保障应用的稳定运行。
506 25
|
存储 关系型数据库 MySQL
MySQL进阶突击系列(06)MySQL有几种锁?| 别背答案,现场演示一下
本文详细解析了MySQL InnoDB存储引擎的锁机制,涵盖读锁、写锁、意向锁、记录锁、间隙锁和临键锁等8种锁类型。重点探讨了不同锁类型的加锁与释放方式,以及事务并发场景下的实战验证。通过具体示例,展示了在不同情况下锁的行为及其对事务的影响。文章还特别强调了锁的作用范围主要是索引,并解释了锁如何影响数据的读写操作。最后总结了并发事务中加锁规则,帮助读者深入理解MySQL的锁机制。
|
存储 SQL 关系型数据库
MySQL的事务隔离级别
【10月更文挑战第17天】MySQL的事务隔离级别
374 43

推荐镜像

更多