MySQL 事务

特性

事务四大特性:

  1. 原子性(Atomicity):事务是最小的操作单元,要么全部成功,要么全部失败。
  2. 一致性(Consistency):事务执行前后,数据都保持一致状态。
  3. 隔离性(Isolation):事务提交前的中间状态对其他事务不可见,即相互隔离。
  4. 持久性(Durability):事务一旦提交,它对数据库中数据的改变就是永久的。

底层实现

复制代码
原子性是undo log实现的,一致性是由代码逻辑层面保证的,隔离性是由mvcc实现的,持久性是基于redo log实现的。

Redo Log(重做日志):

复制代码
Redo Log记录的是物理日志,也就是磁盘数据的修改。 
用来保证服务崩溃后,仍能把事务中变更的数据持久化到磁盘上。
  • 修改流程:
  1. 从磁盘加载数据到内存
  2. 在内存中修改数据
  3. 把新数据写到Redo Log Buffer中
  4. 把Redo Log Buffer中数据持久化到Redo Log文件中
  5. 把Redo Log文件中数据持久化到数据库磁盘中

Undo Log(回滚日志):

复制代码
Undo Log记录的是逻辑日志,用来回滚事务时,恢复到修改前的数据。
比如:当我们执行一条insert语句时,Undo Log就记录一条相反的delete语句。
  • 修改流程:
  1. 从磁盘加载数据到内存
  2. 在内存中修改数据
  3. 把相反逻辑语句写到Redo Log Buffer中
  4. 把Redo Log Buffer中数据持久化到Redo Log文件中
  5. 把Redo Log文件中数据持久化到数据库磁盘中

MVCC(多版本并发控制,Multi-Version Concurrency Control):

  1. 记录的是某个时间点上的数据快照,用来实现不同事务之间数据的隔离性。
  2. 解决了读写冲突,实现了读写并行,提升了事务的性能。
  3. 只在Read Committed和Repeatable Read两种隔离级别下起作用。
实现方式:
  1. 通过两个隐藏列trx_id(上个修改事务的ID)和roll_pointer(上个版本的地址),建立一个版本链。
  2. 并在事务中读取的时候生成一个ReadView(读视图)
  3. 在Read Committed隔离级别下,每次读取都会生成一个读视图,
  4. 在Repeatable Read隔离级别下,只会在第一次读取时生成一个读视图。
并发事务产生的问题
  1. 脏读: 一个事务读到其他事务未提交的数据。
  2. 不可重复读: 多次读取相同的数据,得到的结果集不一致,即读到其他事务提交后的数据。
  3. 幻读: 相同的查询条件,多次读取的结果不一致,即读到其他事务提交后的数据。
  4. 不可重复读与幻读的区别是: 不可重复读是读到了其他事务执行update、delete后的数据,而幻读是读到其他事务执行insert后的数据。
隔离级别
  1. Read UnCommitted(读未提交): 读到其他事务未提交的数据,会出现脏读、不可重复读、幻读。
  2. Read Committed(读已提交): 读到其他事务已提交的数据,解决了脏读,会出现不可重复读、幻读。
  3. Repeatable Read(可重复读): 相同的数据,多次读取到的结果集一致。解决了不可重复读,还是会出现幻读。
  4. Serializable(串行化): 所有事务串行执行,解决了幻读。
解决幻读
  • 当前读: 读取数据的最新版本,并对数据进行加锁。

    例如:insert、update、delete、select for update

  • 快照读: 读取数据的历史版本,不对数据加锁。

    例如:select

  • 在当前读的情况下,是通过加锁来解决幻读。

  • 在快照读的情况下,是通过MVCC来解决幻读。

参考文章:mysql事务处理机制是怎样的?

相关推荐
fengye2071611 小时前
板凳-------Mysql cookbook学习 (十一--------10)
学习·mysql·adb
kfepiza7 小时前
Debian-10编译安装Mysql-5.7.44 笔记250706
linux·数据库·笔记·mysql·debian·bash
不剪发的Tony老师7 小时前
phpMyAdmin:一款经典的MySQL在线管理工具又回来了
数据库·mysql·phpmyadmin
张璐月10 小时前
mysql的性能优化:组提交、数据页复用、全表扫描优化、刷脏页
数据库·mysql·性能优化
渣渣盟11 小时前
Flink数据流高效写入MySQL实战
mysql·flink·scala
NF禾凡11 小时前
【Mysql作业】
数据库·mysql
Kay_Liang13 小时前
MySQL SQL语句精要:DDL、DML与DCL的深度探究
开发语言·数据库·sql·mysql·database
诺亚凹凸曼14 小时前
一条mysql的查询语句是怎样执行的?
数据库·mysql
程序猿小D14 小时前
[附源码+数据库+毕业论文+答辩PPT+部署教程+配套软件]基于SpringBoot+MyBatis+MySQL+Maven+Vue实现的交流互动管理系统
spring boot·mysql·vue·mybatis·毕业论文·答辩ppt·交流互动
刺客xs16 小时前
MYSQL数据库----DCL语句
android·数据库·mysql