当前位置: 首页 > news >正文

5 事务隔离级别与锁机制

事务是由一组SQL语句组成的逻辑处理单元, 事务具有ACID 属性。

  • 原子性(Atomicity) :事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。
  • 一致性(Consistent) :在事务开始和完成时,数据都必须保持一致状态。这意味着所有相关的数据规
    则都必须应用于事务的修改,以保持数据的完整性。
  • 隔离性(Isolation) :数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独
    立”环境执行。这意味着事务处理过程中的中间状态对外部是不可见的,反之亦然。
  • 持久性(Durable) :事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。

5.1 事务隔离级别

  • 读未提交:脏读
  • 读已提交:不可重复读
  • 可重复读:幻读
  • 串行化:-

常看当前数据库的事务隔离级别: show variables like 'tx_isolation';
设置事务隔离级别:set tx_isolation='REPEATABLE-READ';

5.2 锁

(1)全局锁

锁定数据库中的所有表。

对整个数据库实例加锁,加锁后整个实例就只能读。典型的使用场景就是做全库的逻辑备份。对所有的表进行锁定。从而获取一致性视图,保证数据的完整性。


# 添加全局锁, 对某个数据库服务的所有数据库进行加锁
FLUSH TABLES WITH READ LOCK; # 逻辑备份
# 备份单个库 操作系统命令行运行
mysqldump -u 用户 -p 密码 --databases 库名 > /路径/备份名.sql   
# 备份所有库
mysqldump -u 用户 -p 密码 --all-databases > /路径/全量备份.sql  
# 压缩备份
mysqldump -u 用户 -p 密码 库名 | gzip > 备份.sql.gz# 解锁
UNLOCK TABLES;
  • 特点
    • 如果在主库上备份,那么在备份期间都不能执行更新. 业务基本上就得停摆
    • 如果在从库上备份,那么在备份期间从库不能执行主库同步过来的二进制日志(binlog), 会导致主从延迟.
  • 在InnoDB中, 可以在备份时加上参数--single-transaction参数来完成不加锁的一致性数据备份.
mysqldump --single-transaction -uroot -proot -h192.168.56.2 test_lock > test.sql # 底层通过快照读实现

(2)表级锁

每次操作锁住整张表。

分类:

  • 表锁
  • 元数据锁(meta data lock, MDL)
  • 意向锁

表锁

  • 表共享读锁(read lock)
# 加锁
LOCK TABLES table_a read;# 解锁, 客户端连接断开会自动解锁
UNLOCK TABLES 
  • 表独占写锁(write lock)
# 加锁
LOCK TABLES table_a write;
UNLOCK TABLES;

元数据锁(meta data lock, MDL)

MDL加锁过程是系统自动控制, 无需显示使用. 在访问一张表的时候会自动加上. MDL锁主要作用是维护表元数据的数据一致性. 在表上有活动的事务时, 不可以对元数据进行写入操作. 为了避免DML和DDL冲突, 保证读写的正确性。

维护表结构的数据一致性.

即: 在某张表存在活动的事务时, 不能修改该表的表结构.

在MySQL5.5中引入了MDL,当对一张表进行增删改査的时候,加MDL读锁(共享);当对表结构进行变更操作的时候,加MDL写锁(排他)

image

查看元数据锁:

select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema.metadata_locks;

意向锁

为了避免行锁和表锁的冲突,在InnoDB中引入了意向锁。使得表锁不用检查每行数据是否加锁, 使用意向锁来减少加表锁的检查。

  1. 意向共享锁/读锁
  2. 意向排他锁/写锁
  • 查看意向锁和行锁的加锁情况
select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema.data_locks;

(3)行级锁

每次操作锁住对应的行数据。

  • 介绍

行级锁, 每次操作锁住对应的行数据。锁定粒度最小, 发生冲突的概率最低, 并发度最高。 应用到InnoDB中。

InnoDB是基于索引组织数据的。 行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁。

  • 行级锁分类

    • 行锁(Record Lock):锁定单个行记录的锁。防止其他事务对此进行update和delete。RC和RR都支持

    image

    • 间隙锁(Gap Lock):锁定某个记录间隙(不含该记录)。确保索引记录间隙不变。防止其他事务在此间隙进行insert,产生幻读。在RR隔离级别下支持。

      image

    • 临键锁(Next-Key Lock):行锁和间隙锁的组合,同时锁住数据,并锁住前面的间隙。在RR下支持。

    image

共享锁(S) / 读锁

允许事务去读加了读锁的数据,但是不允许写操作。

排他锁(X)/ 写锁

当一个事务对某行数据加了写锁, 其他事务即不能读取,也不能写入。

image

加了共享锁后,其他事务不能在该查询的区间之内进行insert,update、delete操作。

image

image

select * from a;
# +----+-------+------+
# | id | name  | age  |
# +----+-------+------+
# |  1 | tom   |  111 |
# |  5 | zs    |   38 |
# | 10 | jully |   30 |
# +----+-------+------+
# 3 rows in set (0.00 sec)# 事务A
update a set name = "TT" where id = 2; # id=2数据不存在,自动升级为间隙锁,锁住1<id<5的间隙,防止插入操作
#Query OK, 0 rows affected (0.00 sec)
#Rows matched: 0  Changed: 0  Warnings: 0# 事务B
insert into a (id,name,age) value(2,"jully",30); # 插入id=2的数据失败,因为有间隙锁

image

http://www.hskmm.com/?act=detail&tid=8802

相关文章:

  • 我向编程世界宣布的第一声
  • Win11 安装 MinGW
  • 意大利 公证 海牙认证速度 单号 双号
  • Linux命令学习笔记
  • 网络安全需要真正的承诺而非表面功夫
  • 想成为AI绘画高手?打造独一无二的视觉IP!Seedream 4.0 使用指南详解,创意无界,效率翻倍!
  • 完整教程:液氮低温恒温器的应用领域
  • 轮转数组-leetcode
  • CF1864G Magic Square
  • OI TRICKS
  • day37大模型程序开发-GraphRAG理论
  • G
  • AI Compass前沿速览:Nano Bananary、MCP Registry、通义DeepResearch 、VoxCPM、InternVLAM1具身机器人
  • day3536大模型应用开发-模型微调框架
  • 使用NVM管理Node.js版本
  • day12-Trae之一键换脸APP开发02
  • day35大模型应用开发-模型微调
  • Rust多线程:Worker 结构体与线程池中任务的传递机制
  • day10-AI短视频01
  • 详细介绍:今日分享 KMP算法
  • P6631 [ZJOI2020] 序列 题解
  • 初始化一个rust环境
  • 编程里边有好多不容易触及的知识点
  • 25.9.18随笔联考总结
  • P3642 [APIO2016] 烟花表演 解题报告
  • Manim实现闪光轨迹特效
  • Slope Trick 学习笔记
  • 使用 libaudioclient 实现 Android Native层 音频测试工具
  • 漏洞详解--文件上传 如何花样绕过?!
  • 使用Windows客户端访问EDA环境的NFS共享