相信大家都用过事务以及了解他的特点,如原子性 (Atomicity), 一致性(Consistency), 隔离型(Isolation) 以及持久性(Durabilit…

作者:小小木原文:<https://juejin.im/post/5cb2e3b46fb9a0686e40c5cb>

开篇

相信大家都用过事务以及了解他的特点,如原子性 (Atomicity), 一致性(Consistency), 隔离型(Isolation) 以及持久性 (Durability) 等。今天想跟大家一起研究下事务内部到底是怎么实现的,在讲解前我想先抛出个问题: 事务想要做到什么效果?

按我理解,无非是要做到可靠性以及并发处理。

可靠性:数据库要保证当 insert 或 update 操作时抛异常或者数据库 crash 的时候需要保障数据的操作前后的一致,想要做到这个,我需要知道我修改之前和修改之后的状态,所以就有了 undo log 和 redo log。

并发处理:也就是说当多个并发请求过来,并且其中有一个请求是对数据修改操作的时候会有影响,为了避免读到脏数据,所以需要对事务之间的读写进行隔离,至于隔离到啥程度得看业务系统的场景了,实现这个就得用 MySQL 的隔离级别。

下面我首先讲实现事务功能的三个技术,分别是日志文件 (redo log 和 undo log),锁技术以及 MVCC,然后再讲事务的实现原理,包括原子性是怎么实现的,隔离型是怎么实现的等等。最后在做一个总结,希望大家能够耐心看完

二、 redo log 与 undo log 介绍

1. redo log

什么是 redo log ?

redo log 叫做重做日志,是用来实现事务的持久性。该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log), 前者是在内存中,后者在磁盘中。当事务提交之后会把所有修改信息都会存到该日志中。假设有个表叫做 tb1(id,username) 现在要插入数据(3,ceshi)

Untitled

start transaction;select balance from bank where name="zhangsan";// 生成 重做日志 balance=600update bank set balance = balance - 400; // 生成 重做日志 amount=400update finance set amount = amount + 400;commit;

Untitled

redo log 有什么作用?