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

MySQL事务详解

目录

1 事务四大特性ACID

1.1 原子性Atomicity

1.2 一致性Consistent

1.3 隔离性Isolation

1.4 持久性Durable

2 事务并发处理带来的问题

2.1 更新丢失(Lost Update)或者脏写

2.2 脏读(Dirty Reads)

2.3 不可重复读(Non-Repeatable Reads)

2.4 幻读(Phantom Reads)

3 事务的隔离级别

3.1 读未提交

3.2 读已提交

3.3 可重复读

3.4 串行化

4 事务相关的系统表

5 开启事务的方式


1 事务四大特性ACID
1.1 原子性Atomicity
  • 同一事物内的多个操作是原子操作
  • 要么同时成功,要么同时失败

  • undo日志保证了原子性
1.2 一致性Consistent
  • 在事务开始时和结束时,数据都始终保持一个有效的状态
  • 一致性由原子性,隔离性,持久性共同保证

1.3 隔离性Isolation
  • 数据库提供一定的隔离机制,保证事务内在不受外部并发操作影响
  • 事务处理过程中的中间状态对外是不可见的

  • undo日志保证了隔离性
1.4 持久性Durable
  • 事务完成后,对于数据的修改是持久性的
  • 即使出现系统故障也能够保持

  • redo日志+数据文件保证了持久性
2 事务并发处理带来的问题
2.1 更新丢失(Lost Update)或者脏写
  • 多个事务对同一行数据某个字段更新时,覆盖了其他事务更新的数据
  • 不符合一致性

2.2 脏读(Dirty Reads)
  • 事务A正在对数据进行修改,在事务提交前,数据处于不一致性状态
  • 事务B读取数据,如果读到了事务A未提交的数据,则为脏读
  • 读到了其他事务未提交数据
  • 不符合一致性和隔离性
2.3 不可重复读(Non-Repeatable Reads)
  • 一个事务内两次读取数据,由于两次读取期间数据被其他事务修改,导致两次数据读取结果不一致的现象,导致了不可重复读
  • 读到其他事务已提交数据
  • 不符合隔离性
2.4 幻读(Phantom Reads)
  • 一个事务内两次读取数据,由于两次读取期间数据其他事务新插入了数据,导致第二次读读取结果比第一次多的现象,产生了幻读
  • 读到了其他事务插入数据
  • 不符合隔离性

3 事务的隔离级别

隔离级别

不可重复

幻读

更新丢失

读未提交

×

×

×

×

提交

×

×

×

可重复

×

×

串行化

  • 查看事务隔离级别
SHOW VARIABLES LIKE 'transaction_isolation';

  • 设置事务隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE];

3.1 读未提交

不可重复读问题分析

操作

事务A

事务B

设置隔离级别

开启事务

事务A

事务B更新数据

事务A再次

读取到了事务B提交的更新,产生脏读问题

3.2 读已提交

脏读问题分析

操作

事务A

事务B

设置隔离级别

开启事务

事务A

事务B更新数据

事务A再次

事务B未提交更新读取不到解决脏读问题

事务B提交

事务A再次

读取到了事务B已提交更新

产生重读问题

3.3 可重复读

幻读问题分析

操作

事务A

事务B

设置隔离级别

开启事务

事务A

事务B更新数据提交

事务A再次

事务B提交更新读取不到

解决不重读问题

事务B重新开始插入数据

事务A再次

事务B提交插入读取不到

看似解决了幻读问题

但是继续如下操作

事务A更新事务B插入数据

显示更新成功了

事务A再次

读取到了事务B插入数据

产生幻读问题

3.4 串行化

幻读失问题分析

操作

事务A

事务B

设置隔离级别开启事务

事务A读

此时已经数据加上了S锁

事务A插入数据

此时给表加上X

事务B读取数据

此时由于事务A给表加X锁

事务B查询会挂起直至超时失败或者事务A提交

解决了幻读问题

更新丢失问题分析

操作

事务A

事务B

设置隔离级别开启事务

事务A给表加S锁

事务B给表加S锁

事务A更新数据

由于S存在更新挂起

事务B更新数据

此时由于产生死锁,事务B被重启

4 事务相关的系统表
information_schema.INNODB_TRX
information_schema.PROCESSLIST
performance_schema.processlist
performance_schema.threads

5 开启事务的方式
begin;
START TRANSACTION;

相关文章:

  • C#如何动态生成实体类?5种方法详解与实战演示
  • 《TIME-LLM: TIME SERIES FORECASTINGBY REPROGRAMMING LARGE LANGUAGE MODELS》
  • 51单片机实验三:数码管动态显示
  • 游戏引擎学习第233天
  • 基于Redis的4种延时队列实现方式
  • AI数据分析与BI可视化结合:解锁企业决策新境界
  • HTML新标签与核心 API 实战
  • 杂记-LeetCode中部分题思路详解与笔记-HOT100篇-其四
  • LVGL学习(二)——控件
  • ArcPy工具箱制作(下)
  • 【Hot100】41. 缺失的第一个正数
  • 轻量还是全量?Kubernetes ConfigMap 与专业配置中心的抉择
  • 每日一题(8) 求解矩阵最小路径和问题
  • Debian服务器环境下env变量丢失怎么办
  • yocto编译使用共享缓存
  • gbdt总结
  • Mac 选择下载安装工具 x86 还是 arm64 ?
  • Git学习之路(Updating)
  • 多模态大语言模型arxiv论文略读(二十六)
  • mac上安装VMWare Fusion安装ubuntu系统问题
  • 沈辛成评《主动出击》丨科学普及,究竟需要靠谁主动出击
  • 中国正在俄罗斯国内生产武器?外交部:坚决反对无端指责和政治操弄
  • 对话|女足国脚,离开体制“再就业”
  • OpenAI推出全新推理模型o3、o4-mini,以及一个编程智能体
  • 习近平在马来西亚总理安瓦尔举行的欢迎宴会上的致辞
  • 科普|治疗肺癌,中医药与靶向药物如何实现1+1>2?