当前位置: 首页 > 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默认级别串行化Serializable4. 持久性Durability定义事务处理结束后对数据的修改就是永久性的。核心逻辑一旦事务提交即使系统发生故障如断电、宕机修改过的数据也不会丢失会被刷新到磁盘中。三、 事务的版本支持需要注意的是并不是所有的MySQL存储引擎都支持事务。InnoDB支持事务是目前最常用的默认引擎。MyISAM不支持事务。四、 事务的提交方式与基本操作MySQL默认是**自动提交autocommit**的。即每执行一条DML语句MySQL就会自动帮你执行一次 COMMIT。核心操作指令开启事务BEGIN 或 START TRANSACTION;设置保存点SAVEPOINT 点名称; (就像单机游戏的“存盘点”)回滚到保存点ROLLBACK TO 点名称;全部回滚ROLLBACK; (彻底撤销本次事务所有操作)提交事务COMMIT; (正式将改动持久化到磁盘)五、 并发带来的三个“典型问题”在多事务并发执行时如果不进行隔离会产生以下三种现象脏读Dirty Read事务A读到了事务B尚未提交的数据。如果事务B最后回滚了A读到的就是无效的“脏数据”。不可重复读Non-repeatable Read事务A在同一个事务内多次读取同一条数据结果却不一样因为期间事务B修改并提交了该数据。幻读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.gsyq.cn/news/1375334.html

相关文章:

  • 基于机器学习的癫痫发作检测与预测:从EEG信号处理到LSTM时序建模
  • 告别瞎猜!用DBSCAN和K-means搞定毫米波雷达点云聚类,附完整Matlab代码与数据集
  • 基于退火序贯蒙特卡洛的符号回归:从高维物理数据中自动发现多项式约束
  • 纯前端到底要不要学 Java
  • Unity新手避坑指南:从预制体变体到导航网格,这些基础概念别再搞混了
  • CentOS 7最小化安装后,复制粘贴和网络配置的保姆级教程(附图形界面切换)
  • DYNAMIX:基于强化学习的动态批处理优化,破解分布式训练效率与精度困局
  • 手把手教你用Linux命令‘偷看’UEFI启动日志,排查系统启动失败问题
  • 企业IT必看:如何用Chrome企业版MSI配合组策略,实现全网电脑静默部署
  • 流式处理与可解释AI:构建实时电竞胜率预测系统的核心技术
  • GB5768.3钻牛角尖的几点
  • 别再只会用Set-ExecutionPolicy了!深入理解Windows PowerShell的四种执行策略与安全实践
  • ARM SVE架构WHILEGT指令详解与应用优化
  • Ubuntu 22.04下gcc安装报错?手把手教你用apt-get指定版本解决cpp依赖冲突
  • 不止于播放:用Unity Video Player的RenderTexture模式,轻松实现游戏内电视、监控屏效果
  • 2026年智己LS8与问界M7深度分析:家庭增程SUV场景的配置与性能代差困境 - 品牌推荐
  • Unity新手避坑指南:从零搭建第一个3D场景,这些基础概念千万别搞错
  • (干货整理)实测好用的AI写作辅助网站,毕业党收藏备用
  • Unity项目整合透明视频?试试这个Pr+WebM的高效流程(附资源链接)
  • 告别小方块!在Unity中为TextMesh Pro动态加载自定义中文字体的完整流程(含雅黑字体文件)
  • 用Unity做个2D平台跳跃游戏:从角色控制器到粒子特效的全流程实战
  • 因果分析与保形预测:北极降水概率预测的机器学习框架
  • 别再被模型缩放搞懵了!从MMD到UE5,一个Blender单位设置就搞定
  • Unity打包APK后,如何让VS2019/2022像调试编辑器一样打断点?(附ADB连接问题排查)
  • UE4.27 + PICO 3 避坑实录:从Android环境配置到VR插件集成的完整流程
  • Burp Suite安装故障排查:Java版本、JVM参数与GUI线程深度解析
  • 公共部门AI项目实战:从LLM预标注到可审计机器学习流水线构建
  • Unity WebGL打包避坑指南:自定义模板时那些没人告诉你的细节(以2021.3.2为例)
  • Houdini刚体破碎VAT导出到UE5:从静态碎片到动态 Niagara 粒子群的实战转换
  • 电商App的doCommandNative:JNI命令总线与协议逆向实战