MYSQL-事务原理

作者: 小亮__ | 来源:发表于2019-07-08 12:54 被阅读8次

ACID模型

MYSQL传统关系数据库的ACID模型有以下特性

  • Atomicity原子性:一个事务中所有操作都必须全部完成,要么全部不完成。
  • Consistency一致性. 在事务开始或结束时,数据库应该在一致状态。
  • Isolation隔离性. 事务将假定只有它自己在操作数据库,彼此不知晓。
  • Durability持久性.一旦事务完成,就不能返回。

而MYSQL上述的ACID模型的实现原理如下

事务的原子性是通过 undo log 来实现的
事务的持久性性是通过 redo log 来实现的
事务的隔离性是通过 (读写锁+MVCC)来实现的
而事务的终极大 boss 一致性是通过原子性,持久性,隔离性来实现的!!!

下面就分别来介绍其实现原理

原子性(Atomicity)原理

一个事务必须被视为不可分割的最小工作单位,一个事务中的所有操作要么全部成功提交,要么全部失败回滚,对于一个事务来说不可能只执行其中的部分操作,这就是事务的原子性。

以上概念大家都了解,那么数据库是怎么实现的呢? 就是通过回滚操作。 所谓回滚操作就是当发生错误异常或者显式的执行rollback语句时需要把数据还原到原先的模样,所以这时候就需要用到undo log来进行回滚。

undo log 就是用于记录更新或新增操作之前的数据状态,当出现需要回滚的情况时,将原数据刷回到数据库中,从而保证操作的原子性,具体实现方式如下:

上面从银行账户转账到理财账户的操作步骤如下
1.事务开始
2.查询数据
3.进行update操作,balance=balance-400;
4.记录zhangsan(1000)到undo log 日志中,回滚时需要将数据更新回来
5.进行update操作,amount=amount+400;
6.记录amount(0)到undo log日志中,回滚的时候需要将数据刷新回来
7.事务提交/回滚

持久性(Durability)原理

事务一旦提交,其所作做的修改会永久保存到数据库中,此时即使系统崩溃修改的数据也不会丢失。

MySQL的数据存储,表数据是存放在磁盘上的,因此想要存取的时候都要经历磁盘IO,然而即使是使用SSD磁盘IO也是非常消耗性能的。 为此,为了提升性能InnoDB提供了缓冲池(Buffer Pool),Buffer Pool中包含了磁盘数据页的映射,可以当做缓存来使用:

  • 读数据:会首先从缓冲池中读取,如果缓冲池中没有,则从磁盘读取在放入缓冲池;
  • 写数据:会首先写入缓冲池,缓冲池中的数据会定期同步到磁盘中;

上面这种缓冲池的措施虽然在性能方面带来了质的飞跃,但是它也带来了新的问题,当MySQL系统宕机,断电的时候可能会丢数据!因为我们的数据已经提交了,但此时是在缓冲池里头,还没来得及在磁盘持久化,所以我们急需一种机制需要存一下已提交事务的数据,为恢复数据使用。
redo log就派上用场了

redo log来记录已成功提交事务的修改信息,并且会把redo log持久化到磁盘,系统重启之后在读取redo log恢复最新数据。

隔离性(Isolation)原理

Mysql 隔离级别有以下四种(级别由低到高):

  • READ UNCOMMITED (读未提交)
  • READ COMMITED (读已提交)
  • REPEATABLE READ (可重复读)
  • SERIALIZABLE (串行化)

隔离性是要管理多个并发读写请求的访问顺序。 这种顺序包括串行或者是并行,从隔离性的实现可以看出这是一场数据的可靠性与性能之间的权衡,可靠性性高的,并发性能低(比如 Serializable),可靠性低的,并发性能高(比如 Read Uncommited)

READ UNCOMMITTED

概念:在READ UNCOMMITTED隔离级别下,事务中的修改即使还没提交,对其他事务是可见的。事务可以读取未提交的数据,造成脏读。

原理:因为读不会加任何锁,所以写操作在读的过程中修改数据,所以会造成脏读。好处是可以提升并发处理性能,能做到读写并行。

READ COMMITTED

概念:一个事务的修改在他提交之前的所有修改,对其他事务都是不可见的。其他事务能读到已提交的修改变化。在很多场景下这种逻辑是可以接受的

原理:InnoDB在 READ COMMITTED,使用排它锁,读取数据不加锁而是使用了MVCC机制。或者换句话说他采用了读写分离机制。

READ COMMITTED 级别下的MVCC机制,在该隔离级别下每次 select的时候新生成一个版本号,所以每次select的时候读的不是一个副本而是不同的副本。在每次select之间有其他事务更新了我们读取的数据并提交了,那就出现了不可重复读

REPEATABLE READ(Mysql默认隔离级别)

在一个事务内的多次读取的结果是一样的。这种级别下可以避免,脏读,不可重复读等查询问题。mysql 有两种机制可以达到这种隔离级别的效果,分别是采用读写锁以及MVCC。

  • 采用读写锁的实现


优点:实现起来简单,缺点:无法做到读写并行

  • 采用MVCC的实现


多次读取只生成一个版本,读到的自然是相同数据
优点:读写并行 ,缺点:实现的复杂度高

MVCC (MultiVersion Concurrency Control) 叫做多版本并发控制,InnoDB的 MVCC ,是通过在每行记录的后面保存两个隐藏的列来实现的。这两个列, 一个保存了行的创建时间,一个保存了行的过期时间, 当然存储的并不是实际的时间值,而是系统版本号,其实现思想是通过数据多版本来做到读写分离。从而实现不加锁读进而做到读写并行。MVCC在mysql中的实现依赖的是undo log与read view

  • undo log :undo log 中记录某行数据的多个版本的数据。
  • read view :用来判断当前版本数据的可见性

SERIALIZABLE

该隔离级别理解起来最简单,实现也最单。在隔离级别下除了不会造成数据不一致问题,没其他优点。


相关文章

  • MYSQL-事务原理

    ACID模型 MYSQL传统关系数据库的ACID模型有以下特性 Atomicity原子性:一个事务中所有操作都必须...

  • 08 MySQL-初识MySQL-事务-隔离鉴别

    如果没有特别说明,都是默认autocommit=1 根据我的第三篇03 MySQL-初识MySQL-事务隔离级别提...

  • MySQL-事务

    ACID 测试 ACID 表示原子性、一致性、隔离性和持久性。一个运行良好的事务处理系统,必须具备这些标准概念。 ...

  • Mysql-事务

    事务特性ACID 原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,...

  • Mysql-事务

    MySQL 数据库中事务是用户一系列的数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。 为什...

  • Mysql-事务

    数据库事务4个特性 by shihang.mai 简称:ACID 特性解析原子性要么全部成功,要么全部失败一致性当...

  • mysql-事务

    http://baijiahao.baidu.com/s?id=1581064626251873652&wfr=s...

  • # MySQL-事务介绍

    --- [TOC] --- # MySQL事务 ## ACID 1.**原子性(Atomcity)** 一个事务的...

  • MySQL-事务(Transaction)

    MySQL事务 特性(ACID): 原子性(automicity):要不全部成功,要不全部失败 一致性(consi...

  • MySQL-事务&MVCC

    前置文章:一、MySQL-存储引擎[https://www.jianshu.com/p/495108c767bc]...

网友评论

    本文标题:MYSQL-事务原理

    本文链接:https://www.haomeiwen.com/subject/gedohctx.html