2023.12.7 关于 MySQL 事务详解

目录

事务的四大特性

原子性

一致性

持久性

隔离性

事务并发执行

脏读

不可重复读

幻读

四个隔离级别

[read uncommitted](#read uncommitted)

[read committed](#read committed)

[repeatable read](#repeatable read)

serializable


事务的四大特性

原子性

  • 一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节
  • 事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从未发生过一样

一致性

  • 指在数据库事务执行的过程中,系统从一个一致的状态转移到另一个一致的状态
  • 一致性确保了数据库的完整性和业务规则的正确性

实例理解

  • 银行转账事务
  • 如果在事务执行前,两个账户的总和是 1000 元,那么在事务执行后,两个账户的总和应该仍然是 1000 元
  • 这确保了在任何时刻,数据库都处于合法、符合业务规则的状态

持久性

  • 事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失

注意:

  • 事务在执行的时候,会把执行的过程先记录到硬盘上,再执行要进行的操作(该记录不会随着断电而丢失)
  • 如果一个事务执行到一半 断电了!
  • 等到下次重启的时候,此时 mysql 就会感知到,上个事务这里执行到了中间状态
  • 就会根据之前记录的执行过程,进行回滚了!

隔离性

  • 数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致
  • 事务隔离分为不同级别,包括读未提交、读提交、可重复读、串行化

事务并发执行

  • Mysql 是一个关系型数据库管理系统,其本体为数据库服务器,该服务器负责存储、管理、处理数据,并提供了一套 sql 语言接口供客户端与之交互
  • 客户端通过连接到 Mysql 服务器,可以向服务器发送 sql 语句
  • 事务是由一组 sql 语句组成的逻辑工作单元,它要么全部执行成功,要么全部失败回滚,事务通过执行 sql 语句来对数据库进行读取和更新操作
  • 在多用户的数据库环境中,多个客户端可以同时连接到数据库服务器,并发送各自的事务请求,这就是并发执行,即多个事务可以同时在数据库中执行

  • 多个事务同时操作数据库时可能会发生下述三种问题

脏读

  • 脏读发生在一个事务读取了另一个事务还未正式提交的数据,因为存在回滚的可能性

实例理解

解决方法

  • 给正在被修改的字段加上 写****锁

不可重复读

  • 不可重复读发生在一个事务内的两次读取之间,另一个事务修改了数据,导致两次查询结果不一致

实例理解

解决方法

  • 给正在被查询的字段加上 读锁

幻读

  • 幻读发生在一个事务内的两次查询之间,另一个事务插入或删除了数据,导致两次查询结果不一致

实例理解

解决方法

  • 加上读锁 无法解决幻读问题,因为读锁仅作用于被查询的字段,无法被其他事务修改其字段值
  • 使用串行化的方式才能解决该问题,即事务必须 串行 执行,不能 并行 执行

四个隔离级别

  • Mysql 提供了四个隔离级别

read uncommitted

  • 对事务的并发执行不做任何限制
  • 其并发程度最高,隔离性最低
  • 会产生脏读、不可重复读、幻读的问题

read committed

  • 对写操作加锁
  • 并发程度降低了,隔离性提高了
  • 解决了脏读的问题,任然存在不可重复读、幻读的问题

repeatable read

  • mysql 的默认隔离级别
  • 对写和读都加锁了
  • 并发程度又降低了,隔离性又提高了
  • 解决了脏读、不可重复读的问题,任然存在幻读问题

serializable

  • 严格串行化
  • 并发程度最低(串行执行),隔离性最高
  • 解决了脏读、不可重复读、幻读的问题

注意:

  • 从上到下
  • 隔离性依次增高
  • 并发性依次降低
  • 执行速度依次降低
  • 数据可靠性依次提高

总结:

  • 在实际的开发中就可以根据当前要解决的问题的需求场景,来决定使用哪个隔离级别
  • 如果涉及到 金钱交易 这样的场景,就可以让让并发性低一点,隔离性高一点,以提高精准度
  • 如果涉及到 统计点赞数、浏览量 这样的场景 ,就可以让并发性高一点,隔离性低一点,以提高效率
相关推荐
喜欢打篮球的普通人15 分钟前
LLVM后端指令选择
android·java·javascript
某不知名網友22 分钟前
C++ 七大排序算法完整讲解
java·算法·排序算法
CodeStats30 分钟前
《源纹天书》第一百六十一章至第一百六十五章:开源化宣言、元定义的力量、栈帧重构、容器道场升级、技术债的化身!
java·源纹天书
不良手残35 分钟前
MyBatisPlus代码自动生成器
java
SamDeepThinking38 分钟前
一次线程池线上故障复盘:四层防线如何避免数据丢失
java·后端·程序员
渣渣灰飞1 小时前
MySQL 系统学习 第五阶段:企业级 MySQL 实战开发 第一章:企业数据库设计规范
数据库·学习·mysql
花生智源1 小时前
Java实现Prompt工程的技巧——从模板到工程化,告别字符串拼接
java·人工智能
折哥的程序人生 · 物流技术专研1 小时前
Java 23 种设计模式:从踩坑到精通 | 番外:策略 vs 模板方法 —— 组合与继承的终极对决
java·策略模式·java面试·comparator·模版方法模式·java设计模式·从踩坑到精通
库克克1 小时前
【C++】类和对象--this指针详解
java·开发语言·c++
SL_staff1 小时前
JVS低代码完整源码解析:如何二次开发自己的表单组件?
java·低代码·vuex