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

Mysql:事务管理(上)

在数据库的操作中,我们最常用的就是增删改查(CURD)。但在多用户并发的场景下,如果简单的CURD不加控制,会发生什么?

想象一个火车站售票系统

  • 当前票数:1张。

  • 客户端A:检查发现还有1张票,准备下单。

  • 客户端B:在同一时刻也检查了票数,发现还有1张,也准备下单。

  • 结果:A和B都买到了票,数据库票数变成-1。这就是典型的“超卖”问题。

为了解决这类并发导致的数据不一致问题,MySQL引入了——事务(Transaction)


一、 什么是事务?

事务是一组DML(数据操作语言)语句的集合。在逻辑上,这些语句具有强相关性。

事务内的SQL语句要么全部执行成功,要么全部执行失败。

事务有两种类型:

1)当autocommit = ON,一个单独的SQL语句就是一个事务

比如select *from Roles;

2)由begin开始,commit结束

begin;

savepoint s1;

...

savepoint s2;

...

rollback;

commit;

二、 事务的核心特性:ACID原则

一个完整的事务必须满足四个属性,简称ACID

1. 原子性(Atomicity)
  • 定义:事务是不可分割的最小工作单元。

  • 核心逻辑:事务中的所有操作要么全部完成,要么全部不完成。

  • 实现机制:如果在执行过程中发生错误,数据库会进行回滚(Rollback),将数据恢复到事务开始前的状态,仿佛这个事务从未发生过一样。

2. 一致性(Consistency)
  • 定义:事务执行前后,数据库的完整性没有被破坏。

  • 核心逻辑:写入的数据必须完全符合所有的预设规则(如约束、触发器等)。一致性其实是原子性、隔离性和持久性共同追求的最终目标

3. 隔离性(Isolation)
  • 定义:数据库允许多个并发事务同时对数据进行读写。隔离性可以防止多个事务交叉执行时导致数据不一致。

  • 隔离级别:为了平衡性能与安全,MySQL提供了四种隔离级别:

    • 读未提交(Read Uncommitted)

    • 读提交(Read Committed)——大部分数据库默认级别

    • 可重复读(Repeatable Read)——MySQL默认级别

    • 串行化(Serializable)

4. 持久性(Durability)
  • 定义:事务处理结束后,对数据的修改就是永久性的。

  • 核心逻辑:一旦事务提交,即使系统发生故障(如断电、宕机),修改过的数据也不会丢失,会被刷新到磁盘中。

三、 事务的版本支持

需要注意的是,并不是所有的MySQL存储引擎都支持事务。

  • InnoDB:支持事务,是目前最常用的默认引擎。

  • MyISAM:不支持事务。

四、 事务的提交方式与基本操作

MySQL默认是**自动提交(autocommit)**的。即每执行一条DML语句,MySQL就会自动帮你执行一次 COMMIT。

核心操作指令:

  • 开启事务:BEGIN 或 START TRANSACTION;

  • 设置保存点:SAVEPOINT 点名称; (就像单机游戏的“存盘点”)

  • 回滚到保存点:ROLLBACK TO 点名称;

  • 全部回滚:ROLLBACK; (彻底撤销本次事务所有操作)

  • 提交事务:COMMIT; (正式将改动持久化到磁盘)

五、 并发带来的三个“典型问题”

在多事务并发执行时,如果不进行隔离,会产生以下三种现象:

  1. 脏读(Dirty Read):事务A读到了事务B尚未提交的数据。如果事务B最后回滚了,A读到的就是无效的“脏数据”。

  2. 不可重复读(Non-repeatable Read):事务A在同一个事务内多次读取同一条数据,结果却不一样(因为期间事务B修改并提交了该数据)。

  3. 幻读(Phantom Read):事务A在同一个事务内多次按某个条件查询,结果发现记录数变多了(因为期间事务B插入并提交了新记录)。

知晓了这三个问题,我们来看看四大隔离级别。


六、四大隔离级别(读-写)

为了解决上述问题,SQL标准定义了四种隔离级别。MySQL通过这些级别,在“性能”与“安全性”之间寻求平衡。

数据库并发的场景有三种:读-读,读-写,写-写

1.读-读:不存在任何问题,也不需要并发控制

2.读-:有线程安全问题,可能会造成事务隔离性问题,可能遇到脏读,幻读,不可重复读

3.-:有线程安全问题,可能会存在更新丢失问题,比如第一类更新丢失,第二类更新丢失(后面补充)

这里先用读-写场景来介绍四种隔离级别。

1. 读未提交(Read Uncommitted)

特点:最低级别,没有任何隔离性。

现象:会产生脏读、不可重复读、幻读。

评价:性能最高,但安全性极差,生产环境基本禁用


2. 读提交(Read Committed, RC)

  • 特点:一个事务只能读到其他事务已经提交的数据。

  • 现象:解决了脏读,但存在不可重复读和幻读。

  • 评价:许多主流数据库(如Oracle, SQL Server)的默认隔离级别。

3. 可重复读(Repeatable Read, RR)

  • 特点:保证在同一个事务内,多次读取同一条记录的结果是一致的。

  • 现象:解决了脏读、不可重复读、幻读。( 理论上RR仍存在幻读,但MySQL的InnoDB引擎通过Next-Key Lock(间隙锁)在很大程度上解决了幻读问题。)

  • 评价:MySQL的默认隔离级别,兼顾了性能与数据一致性。

防止不可重复读:

防止幻读:

4.串行化(Serializable)

  • 特点:最高的隔离级别。所有事务按顺序排队执行。

  • 现象:解决所有并发问题(脏读、不可重复读、幻读)。

  • 评价:它会对读取的每一行数据都加锁,会导致大量的超时和锁竞争,性能极低,除非对数据一致性有极端严格的要求,否则不使用。

可以看到,阻塞的时候,mysql不会有输出,也不会让你执行下一步操作。

总结:

http://www.jsqmd.com/news/881804/

相关文章:

  • Godot 4.2 2D游戏开发:用TileMap图层一键搞定游戏地图的可行走区域
  • AI给组内同事的脚本能力价值打了1折!
  • 避坑指南:UE5多人游戏中玩家生成与数据同步的3个常见错误(以Lobby为例)
  • 告别SteamVR依赖:用Unity 2022 LTS的OpenXR插件直连HTC Vive Cosmos全流程
  • Unity异步编程新选择:用R3和NuGetForUnity搞定响应式事件流(附AOT兼容性测试)
  • CVE-2025-48976:Apache Commons FileUpload 协议解析层内存崩溃漏洞深度解析
  • 告别瞎猜!用DBSCAN和K-means搞定毫米波雷达点云聚类,附完整Matlab代码与数据集
  • CentOS 7最小化安装后,复制粘贴和网络配置的保姆级教程(附图形界面切换)
  • XGBoost处理缺失值:构建面向天文大数据的极冷矮星智能发现系统
  • 告别传统地形!用Unreal Engine的Voxel Plugin,5分钟打造一个可实时编辑的无限世界
  • 避坑指南:UE5多人联机时,玩家角色生成(Spawn)的5个常见错误与修复方法
  • 别再为Unity视频播放发愁了!Video Player从创建到避坑,保姆级教程带你搞定
  • 基于退火序贯蒙特卡洛的符号回归:从高维物理数据中自动发现多项式约束
  • (干货整理)实测好用的AI写作辅助网站,毕业党收藏备用
  • SSD健康预测:BiGRU-MHA混合模型技术解析
  • 告别传统地形!用Unreal Engine的Voxel Plugin手把手教你做可破坏的无限世界(含动态NavMesh配置)
  • Unity新手避坑指南:从预制体变体到导航网格,这些基础概念别再搞混了
  • 基于Wi-Fi CSI与LSTM的非接触式心肺监测系统PulseFi详解
  • GameFramework资源管理实战:从Resource Editor配置到ProcedureLaunch初始化的完整代码解析
  • UE5多人联机开发:从大厅到游戏,如何让玩家带着自定义名字‘出生’?
  • 告别卡顿!用IL2CPP优化你的Unity游戏:性能提升与包体瘦身实测
  • 《AI推理优化实战:从高延迟高成本到高效低耗,企业级AI落地必备技术》
  • 模块化触觉显示系统:个性化人机交互的硬件与算法创新
  • 流式处理与可解释AI:构建实时电竞胜率预测系统的核心技术
  • UE5 RPG实战:告别旧输入系统,用增强输入(Enhanced Input)优雅触发你的技能
  • UE4.27 + PICO 3 避坑实录:从Android环境配置到VR插件集成的完整流程
  • 不止于切换:用Unity和PICO4 SDK打造一个可交互的VR场景导航菜单
  • Unity 2D游戏地图制作:从零上手Tile Palette的7个核心工具(附快捷键清单)
  • Unity无边框窗口保任务栏与Alt+Tab的Windows API方案
  • 别再死记硬背了!用‘橡皮筋’和‘电线杆’比喻,5分钟彻底搞懂Unity UI锚点(Anchors)