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

MySQL事务

目录

回滚机制

日志

事务的基本属性

原子性

一致性

持久性

隔离性

1.脏读

读加锁

2.不可重复读

写加锁

3.幻读

串行化

MySQL事务隔离级别


事务:把多个操作打包成一个整体。这个整体中的操作要么都执行成功,要么就一个都不执行。这里的执行并不是真的不执行,而是数据库会将这些操作回滚,恢复到事务没有执行的状态。数据库事务的原子性核心就是通过回滚机制保证的。

日常开发中,往往需要配合多条sql语句配合完成一种操作,例如转帐,张三给王五转账500元。数据库中就会执行张三账户减少500元,王五账户增加500元,如果对王五账户增加操作失败,但张三账户减少操作成功,那么就会出现问题,此时就需要使用事务,保证多条sql语句的正常执行。

回滚机制

事务中的若干sql语句在执行时是一条一条向下执行的,当某一条sql出现问题时,数据库就会自动把前面sql语句造成的影响恢复回去,这种操作就是回滚

日志

为了实现回滚机制,数据库会在执行事务时记录日志,当事务执行完成,没有遇到问题,这部分日志就不会发挥作用,当执行事务的过程中出现问题了,MySQL就会根据日志中的内容进行恢复操作:

新增操作:把新增的内容删除

删除操作:新增删除的内容

修改操作:将数据改为未修改的状态

查询操作:不影响数据库,不需要任何恢复行为

日志中记录的内容就给回滚操作提供了依据。只要数据库处于正常工作状态,就能够始终保持事务的正确操作被正确回滚。 

事务的基本属性

原子性,一致性,持久性,隔离性。

原子性

事务执行中,要么全部执行成功,只要事务执行过程中遇到错误就执行失败。通过回滚机制触发还原。

一致性

执行事务的前后,数据都是一致的,保证数据的正确性。即使触发回滚,回滚的数据也是符合要求的。

持久性

执行事务对数据库产生的修改就会在硬盘上持久保持,程序重启数据仍然存在。

隔离性

数据库在并发执行事务时,会彼此产生影响。

数据库在处理事务时,一个一个处理就会降低处理的速度,一起处理又会引发问题。

1.脏读

数据库中存在两个事务AB,事务A对某一数据进行修改,在事务A提交之前,事务B就对数据进行了读取,最终导致事务B读取的数据和事务A提交的数据不同。

读加锁

可以通过加锁,在事务A执行过程中,事务B的读取操作不能进行,要等待事务A执行完成,降低了并发能力,提高了隔离性和数据的准确性。

2.不可重复读

数据库中存在3个事务ABC,事务A针对数据进行修改之后,事务B对数据进行读取操作,并且多次读取,同一时刻事务C又对数据进行了修改,导致事务B的多次读取操作结果不一致。

写加锁

进一步加锁,写入数据的时候其他事务不能进行读操作,有事务进行读操作时,其他事务不能进行修改操作。引入读加锁,并发程度进一步降低,效率也随之降低,隔离性进一步提高,数据准确性也提高。

3.幻读

事务A针对数据进行修改之后,事务B对数据进行读取操作,并且多次读取,此时事务C没有对数据进行修改,而是给对应表中进行了新增/删除操作,导致事务B读取的事务集不同,已有数据内容相同,但数据的条数增多/减少。

串行化

使用串行化解决幻读问题,串行化使事务都严格按照一个接一个的方式执行,不在并发执行,效率最低,隔离级别最高,数据最准确。

MySQL事务隔离级别

MySQL提供了4种事务隔离级别,可以在配置文件中进行设置。

read uncommitted:允许读取其他事务未提交的数据        脏读+不可重复读+幻读

read committed:只能读取其他事务提交后的数据            不可重复读+幻读

repeatable read:针对读写操作加锁                                 幻读

serializable:所有事务串行执行                                        无并发性,隔离性最高

根据不同的业务场景选择不同的隔离级别,以保证更高的效率和准确性。例如转账使用串行化,点赞系统设置成读未提交。

感谢观看

相关文章:

  • deepseek+kimi一键生成PPT
  • 物联网软件开发与应用方向应该怎样学习,学习哪些内容,就业方向是怎样?(文末领取整套学习视频,课件)物联网硬件开发与嵌入式系统
  • Proxmox VE 8.3 qm 方式导入ESXi Linux OVA UEFI模式虚拟机
  • windows系统远程桌面连接ubuntu18.04
  • 模型报错infeasible,如何查看冲突约束
  • DeepSeek模型R1服务器繁忙,怎么解决?
  • 旅游行业内容管理系统CMS提升网站建设效率与体验
  • Spring boot中实现字典管理
  • xml 和json互转工具
  • 【AI大模型】Ollama部署本地大模型DeepSeek-R1,交互界面Open-WebUI,RagFlow构建私有知识库
  • Java中如何高效地合并多个对象的List数据:方法与案例解析!
  • RealClip正式发布:重新定义轻量化数字内容交互体验
  • 处理数据及其选择关键列进行一次聚类
  • 第5章 数据库系统(选择|案例|论文)(重点★★★★★)
  • Unity中实现动态图集算法
  • 「软件设计模式」工厂方法模式 vs 抽象工厂模式
  • Linux 内核架构入门:从基础概念到面试指南*
  • 《Stable Diffusion绘画完全指南:从入门到精通的Prompt设计艺术》 第三章
  • 【前端框架与库】「深入理解 Vue 插槽」:类型、用法与实际场景解析,增强组件复用性的利器
  • 【力扣题解】【76. 最小覆盖子串】容易理解版
  • 光明日报:家长孩子共同“息屏”,也要保证高质量陪伴
  • 知名猎头公司创始人兼首席执行官庄华因突发疾病逝世,享年62岁
  • 从《让·桑特伊》到《追忆》,假故事的胜利
  • 国台办:台湾自古属于中国,历史经纬清晰,法理事实清楚
  • 七旬男子驾“老头乐”酒驾被查,曾有两次酒驾两次肇事记录
  • 白天气温超30℃的北京,晚间下起了冰雹