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

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;

http://www.xdnf.cn/news/109.html

相关文章:

  • 【Python语言基础】22、异常处理
  • 【web服务_负载均衡Nginx】二、Nginx 核心技术之负载均衡与反向代理
  • Winform发展历程
  • 【电力安全小知识】什么情况下需要铺设绝缘胶垫
  • AIGC产品如何平衡用户体验与内容安全?
  • HDFS入门】HDFS安全与权限管理解析:从认证到加密的完整指南
  • OpenHarmony-Risc-V上运行openBLAS中的benchmark
  • 部署路线Ubuntu_MySQL_Django_绑定域名
  • 【Python3】Django 学习之路
  • 51单片机实验四:键盘检测原理及应用实现
  • 【科研绘图系列】R语言绘制多个气泡图组合图(bubble plot)
  • MATLAB脚本实现了一个转子系统的参数扫描和分岔分析
  • 华为仓颉智能体开发框架 Cangjie Magic深度解析
  • 城市街拍暗色电影胶片风格Lr调色教程,手机滤镜PS+Lightroom预设下载!
  • 【java 13天进阶Day05】数据结构,List,Set ,TreeSet集合,Collections工具类
  • 【C++深入系列】:模版详解(上)
  • 几个常用的快速处理服务器命令和故障排查
  • 使用VHD虚拟磁盘安装双系统,避免磁盘分区
  • 《Operating System Concepts》阅读笔记:p735-p737
  • SQL:聚合函数(Aggregate Functions)
  • 10-openwrt-one调整rootfs_data卷,新增fit2、log、plugins等卷
  • 【MySQL】MySQL表的增删改查(CRUD) —— 上篇
  • MCP 协议:AI 世界的 “USB-C 接口”,开启智能交互新时代
  • PyTorch 深度学习实战(37):分布式训练(DP/DDP/Deepspeed)实战
  • UE5编辑器静止状态下(非 Play 模式)睫毛和眼睛的渲染是正常的,而在 Play 模式下出现模糊
  • Thin-Agent服务(TAS)概述
  • 机器学习在催化剂设计中的应用理论加实操
  • 扫雷-C语言版
  • Linux系统编程学习 day4 进程
  • 深入理解 VMware 虚拟机网络模式:为虚拟化管理铺平道路