【133期】面试官:你说熟悉MySQL事务,那来谈谈事务的实现原理吧!
共 6247字,需浏览 13分钟
· 2021-02-05
阅读本文大概需要 10 分钟。
作者:小小木
cnblogs.com/wyc1994666/p/11367051.html
开篇
事务想要做到什么效果?
可靠性:数据库要保证当insert或update操作时抛异常或者数据库crash的时候需要保障数据的操作前后的一致,想要做到这个,我需要知道我修改之前和修改之后的状态,所以就有了undo log和redo log。
并发处理:也就是说当多个并发请求过来,并且其中有一个请求是对数据修改操作的时候会有影响,为了避免读到脏数据,所以需要对事务之间的读写进行隔离,至于隔离到啥程度得看业务系统的场景了,实现这个就得用MySQL 的隔离级别。
redo log与undo log介绍 mysql锁技术以及MVCC基础 事务的实现原理 总结
二、 redo log 与 undo log介绍
1. redo log
什么是redo log ?
start transaction;
select balance from bank where name="zhangsan";
// 生成 重做日志 balance=600
update bank set balance = balance - 400;
// 生成 重做日志 amount=400
update finance set amount = amount + 400;
commit;
redo log 有什么作用?
redo log是用来恢复数据的 用于保障,已提交事务的持久化特性
2.undo log
什么是 undo log ?
undo log 有什么作用?
undo log是用来回滚数据的用于保障 未提交事务的原子性
三、mysql锁技术以及MVCC基础
1. mysql锁技术
读写锁
2. MVCC基础
InnoDB的 MVCC ,是通过在每行记录的后面保存两个隐藏的列来实现的。这两个列, 一个保存了行的创建时间,一个保存了行的过期时间,当然存储的并不是实际的时间值,而是系统版本号。
undo log :undo log 中记录某行数据的多个版本的数据。 read view :用来判断当前版本数据的可见性
四、事务的实现
事务的原子性是通过 undo log 来实现的 事务的持久性性是通过 redo log 来实现的 事务的隔离性是通过 (读写锁+MVCC)来实现的 而事务的终极大 boss 一致性是通过原子性,持久性,隔离性来实现的!!!
1.原子性的实现
1.1 undo log 的生成
每条数据变更(insert/update/delete)操作都伴随一条undo log的生成,并且回滚日志必须先于数据持久化到磁盘上 所谓的回滚就是根据回滚日志做逆向操作,比如delete的逆向操作为insert,insert的逆向操作为delete,update的逆向为update等。
思考:为什么先写日志后写数据库?---稍后做解释
1.2 根据undo log 进行回滚
如果在回滚日志里有新增数据记录,则生成删除该条的语句 如果在回滚日志里有删除数据记录,则生成生成该条的语句 如果在回滚日志里有修改数据记录,则生成修改到原先数据的语句
2.持久性的实现
读数据:会首先从缓冲池中读取,如果缓冲池中没有,则从磁盘读取在放入缓冲池; 写数据:会首先写入缓冲池,缓冲池中的数据会定期同步到磁盘中;
redo log 的存储是顺序存储,而缓存同步是随机操作。 缓存同步是以数据页为单位的,每次传输的数据大小大于redo log。
3.隔离性实现
READ UNCOMMITED (未提交读) READ COMMITED (提交读) REPEATABLE READ (可重复读) SERIALIZABLE (可重复读)
可靠性性高的,并发性能低(比如 Serializable) 可靠性低的,并发性能高(比如 Read Uncommited)
READ UNCOMMITTED
优点:读写并行,性能高 缺点:造成脏读
READ COMMITTED
REPEATABLE READ(Mysql默认隔离级别)
优点:实现起来简单
缺点:无法做到读写并行
优点:读写并行 缺点:实现的复杂度高
SERIALIZABLE
4.一致性的实现
start transaction;
select balance from bank where name="zhangsan";
// 生成 重做日志 balance=600
update bank set balance = balance - 400;
// 生成 重做日志 amount=400
update finance set amount = amount + 400;
commit;
总结
原子性:使用 undo log ,从而达到回滚 持久性:使用 redo log,从而达到故障后恢复 隔离性:使用锁以及MVCC,运用的优化思想有读写分离,读读并行,读写并行 一致性:通过回滚,以及恢复,和在并发环境下的隔离做到一致性。
推荐阅读:
【132期】面试再被问到Spring容器IOC初始化过程,就拿这篇文章砸他~
【130期】面试官:你能说清楚分布式锁,进程锁,线程锁的区别吗?
微信扫描二维码,关注我的公众号
朕已阅