走进迈莫

mysql事务隔离机制及其原理

2021-01-25  本文已影响0人  迈莫coding

目录

事务特性ACID属性

事务特性指的就是ACID,如图所示:

在这里插入图片描述

并发带来的问题

事务隔离级别

上述所说的"脏读","不可重复读","幻读"这些问题,其实就是数据库读一致性问题,必须由数据库提供的事务隔离机制来进行解决。


在这里插入图片描述

mysql默认事务隔离级别为可重复读(RR)

数据库的事务隔离越严格,并发副作用越小,但付出的代价越大;因为事务隔离本质就是使事务在一定程度上处于串行状态,这本身就是和并发相矛盾的。

同时,不同的应用对读一致性和事务隔离级别是不一样的,比如许多应用对数据的一致性没那么个高要求,相反,对并发有一定要求。

事务实现原理

事务的实现是基于数据库的存储引擎。 不同的存储引擎对事务的支持不一样,接下来以mysql数据库中InnoDB引擎来解说.

InnoDB引擎是mysql的默认存储引擎,隔离级别为不可重复读(RR),并在在RR隔离级别下通过MVCC解决不可重复读问题,通过间隙锁解决幻读问题。因此,InnoDB的RR隔离级别实现了串行化级别的效果,而且还保留了很好的并发性能。

事务隔离性是通过锁来实现的,而事务的原子性,一致性和持久性都是事务日志来实现的。 也就redo log日志和undo log日志,如果想看详细的日志介绍,请看我先前的文章<<校招mysql那些事儿|日志模块binlog/redolog/undolog>> 校招mysql那些事儿|日志模块binlog/redolog/undolog,这里只粗略的介绍redo log和undo log如何实现事务的原子性,一致性和持久性

以下是undo+redo事务的简化过程

  1. 假设有2个数值,分别为A和B,值为1,2
  2. start transaction;
  3. 记录 A=1 到undo log;
  4. update A = 3;
  5. 记录 A=3 到redo log;
  6. 记录 B=2 到undo log;
  7. update B = 4;
  8. 记录B = 4 到redo log;
  9. 将redo log刷新到磁盘
  10. commit

在1-8的任意一步系统宕机,事务未提交,该事务就不会对磁盘上的数据做任何影响。如果在8-9之间宕机,恢复之后可以选择回滚,也可以选择继续完成事务提交,因为此时redo log已经持久化。若在9之后系统宕机,内存映射中变更的数据还来不及刷回磁盘,那么系统恢复之后,可以根据redo log把数据刷回磁盘。

所以,redo log其实保障的是事务的持久性和一致性,而undo log则保障了事务的原子性。

闲聊

文章也会持续更新,可以微信搜索「 迈莫coding 」第一时间阅读。

上一篇 下一篇

猜你喜欢

热点阅读