mysql事务底层原理

事务有四大特性,分别是 原子性 Atomicity、一致性 Consistency、隔离性 Isolation、持久性 Durability,简称ACID。

  • 原子性是指事务中所有操作要么全部成功,要么全部失败。
  • 一致性是指事务执行前后,数据始终处于一致性状态,不会出现数据丢失。
  • 隔离性是指事务提交前的中间状态对其他事务不可见,即相互隔离。
  • 持久性是指事务提交后,数据的修改永久保存在数据库中。

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

redo log

修改数据的过程:从磁盘加载数据到内存;在内存中修改数据;把新数据持久化到磁盘。

这样修改数据会有严重的性能问题:InnoDB 在磁盘中存储的基本单元是页,可能本次修改只变更一页中几个字节,但是需要刷新整页的数据,就很浪费资源;一个事务可能修改了多页的数据,页之间又是不连续的,就会产生随机 IO,性能更差。所以为了提高写入性能,于是就引入了 Redo Log。

引入 Redo Log 后修改流程:从磁盘加载数据到内存;在内存中修改数据;把新数据写到 Redo Log Buffer 中;把 Redo Log Buffer 中数据持久化到 Redo Log 文件中;把 Redo Log 文件中数据持久化到数据库磁盘中。

Undo Log 回滚日志

Undo Log 记录的是逻辑日志,用来回滚事务时,恢复到修改前的数据。

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

  • 记录的是某个时间点上的数据快照,用来实现不同事务之间数据的隔离性。
  • 当前读: 读取数据的最新版本,并对数据进行加锁。
  • 快照读: 读取数据的历史版本,不对数据加锁。
  • 在当前读的情况下,是通过加锁来解决幻读。
  • 在快照读的情况下,是通过MVCC来解决幻读。
posted @ 2023-02-02 14:25  carol2014  阅读(55)  评论(0)    收藏  举报