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事务处理机制是怎样的?

相关推荐
夏炎正好眠1 小时前
mysql练习
数据库·mysql
驜鸈3 小时前
MySQL 的EXPLAIN 计划 type 字段详细说明
android·数据库·mysql
嗨起飞了4 小时前
MySQL入门手册
数据库·mysql
程序员的世界你不懂5 小时前
Mysql配置文件My.cnf(my.ini)配置参数说明
数据库·mysql·百度·新浪微博
ChinaRainbowSea5 小时前
MySQL 索引的数据结构(详细说明)
java·数据结构·数据库·后端·mysql
追风赶月、5 小时前
【MySQL】事务(隔离性、MVCC)
数据库·mysql
Lemon_man_6 小时前
基于Django创建一个WEB后端框架(DjangoRestFramework+MySQL)流程
python·mysql·django
A仔不会笑8 小时前
MySQL面试篇——性能优化
java·数据库·mysql·面试·性能优化
考虑考虑9 小时前
MySQL中的DATE_FORMAT时间函数
数据库·后端·mysql
杭州刘同学10 小时前
autogen studio如何修改数据库为mysql
mysql·autogen