MySQL事务的底层实现原理

362 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。


blog.csdn.net/qq_47902348…

1. 实现事务功能的三个技术****

日志文件(redo log 和 undo log)

锁技术

MVCC  

2. redo log 与 undo log介绍****

(1) redo log****

redo log叫做重做日志,是用来实现事务的持久性。

重做日志缓冲(redo log buffer)以及重做日志文件(redo log),前者是在内存中,后者在磁盘中。

当事务提交之后会把所有修改信息都会存到该日志中。

 

(2) redo log 有什么作用?****

mysql 为了提升性能不会把每次的修改都实时同步到磁盘,而是会先存到Boffer Pool(缓冲池)里头,把这个当作缓存来用。然后使用后台线程去做缓冲池和磁盘之间的同步。

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

 

总结:redo log是用来恢复数据的 用于保障已提交事务的持久化特性。

 

(3) undo log****

undo log 叫做回滚日志,用于记录数据被修改前的信息。

每次写入数据或者修改数据之前都会把修改前的信息记录到 undo log。

 

(4) undo log 有什么作用****

undo log 记录事务修改之前版本的数据信息,因此假如由于系统错误或者rollback操作而回滚的话可以根据undo log的信息来进行回滚到没被修改前的状态。

 

总结:undo log是用来回滚数据的用于保障 未提交事务的原子性

 

3. mysql锁技术****

 

当有多个请求来读取表中的数据时可以不采取任何操作,但是多个请求里有读请求,又有修改请求时必须有一种措施来进行并发控制。不然很有可能会造成不一致。

 

解决上述问题很简单,只需用两种锁的组合来对读写请求进行控制即可,这两种锁被称为:

共享锁(shared lock),又叫做"读锁"****

读锁是可以共享的,或者说多个读请求可以共享一把锁读数据,不会造成阻塞。


排他锁(exclusive lock),又叫做"写锁"****

写锁会排斥其他所有获取锁的请求,一直阻塞,直到写入完成释放锁。

 

总结:通过读写锁,可以做到读读可以并行,但是不能做到写读,写写并行,事务的隔离性就是根据读写锁来实现的。

 

 

4. MVCC****

MVCC (MultiVersion Concurrency Control) 叫做多版本并发控制。

InnoDB的 MVCC ,是通过在每行记录的后面保存两个隐藏的列来实现的。

 

这两个列,一个保存了行的创建时间,一个保存了行的过期时间,当然存储的并不是实际的时间值,而是系统版本号

他的主要实现思想是通过数据多版本来做到读写分离。从而实现不加锁读进而做到读写并行.。

 

MVCC在mysql中的实现依赖的是undo log与read view

undo log :undo log 中记录某行数据的多个版本的数据。

read view :用来判断当前版本数据的可见性

 

 

5. 原子性的实现****

借助undo log来进行回滚,从而保证原子性

 

1.每条数据变更(insert/update/delete)操作都伴随一条undo log的生成,并且回滚日志必须先于数据持久化到磁盘上

2.所谓的回滚就是根据回滚日志做逆向操作,比如delete的逆向操作为insert,insert的逆向操作为delete,update的逆向为update等。

 

6. 持久性的实现****

 

为了提升性能InnoDB提供了缓冲池(Buffer Pool),Buffer Pool中包含了磁盘数据页的映射,可以当做缓存来使用:

读数据:会首先从缓冲池中读取,如果缓冲池中没有,则从磁盘读取再放入缓冲池;

写数据:会首先写入缓冲池,缓冲池中的数据会定期同步到磁盘中;

 

既然redo log也需要存储,也涉及磁盘IO为啥还用它?

(1)redo log 的存储是顺序存储,而缓存同步是随机操作。

(2)缓存同步是以数据页为单位的,每次传输的数据大小大于redo log。

 

 

7. 隔离性实现****

隔离性是要管理多个并发读写请求的访问顺序。 这种顺序包括串行或者是并行

 

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

 

1、READUNCOMMITED(未提交读)

2、READCOMMITED(提交读)

3、REPEATABLEREAD(可重复读)

4、SERIALIZABLE (可重复读)

 

8. 一致性的实现****

通过回滚,以及恢复,和在并发环境下的隔离做到来保证数据的一致性。