本文已参与「新人创作礼」活动,一起开启掘金创作之路。
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. 一致性的实现****
通过回滚,以及恢复,和在并发环境下的隔离做到来保证数据的一致性。