MYSQL日志和事务原理

MYSQL日志和事务原理_第1张图片

1)重做日志:在一个事务中会涉及到多个DML操作,修改的是在内存层面数据页中的数据,还没有及时的将修改之后的数据更新到磁盘中,真正的将更新后的数据写回到磁盘的时候才满足持久性,只是更新内存是不满足持久性的,如果只是更新内存就不叫做持久性,持久性是即使出现数据库的故障,宕机,也不能改变数据被修改的事实,如果出现内存中修改,结果以当即导致磁盘没有被修改,再一恢复,发现磁盘并没有修改,redolog是记录的是物理磁盘上面的页修改操作,比如说页号XXXX,偏移量XXX,写入了什么数据,主要是保证数据的可靠性,实打实物理磁盘的记录;

2)redo和undo都认为是一种数据恢复的操作

3)undolog其实实际上是一种逻辑上的操作,比如说我们写的SQL是逻辑上的操作,unlog记录的是逻辑相反的操作

MYSQL日志和事务原理_第2张图片

1)为什么是以一定频率刷入磁盘?

因为写入磁盘本身就慢,刷盘中的页本身可能是不连续的,随机IO,性能不太好

2)假设事务里面有很多DML操作,这些DML操作都是操作的是内存中的数据,这个时候事务提交了,内存中的数据的修改都完成了,此时磁盘还没有被写入刷盘,逻辑上磁盘上的数据应该被修改了,但是此时commit操作MYSQL宕机了断电了,内存中的数据还没刷盘,如果这个时候没有redlog日志,再次重启内存中的数据没了,磁盘上的数据还是从前的,相当于事务没有执行,此时事务就不保证持久性;

MYSQL日志和事务原理_第3张图片

MYSQL日志和事务原理_第4张图片

3)能不能内存中修改数据,马上就修改磁盘数据,就以一定的频率刷入磁盘?

内存和磁盘是依靠页为单位来进行数据交互的,假设修改了一个字节,那么结果是要把整个页刷到磁盘中,数量大小的对比,效率太低,每进行一个字节的修改操作,都要刷盘嘛?

4)假设进行一个update不加条件,修改的数据在不同的页中,那么此时进行刷盘操作随机IO太麻烦,所以实时修改不太靠谱;

MYSQL日志和事务原理_第5张图片

5)binlog日志,比如说在主从复制的环境下,主机负责写,从机负责读,那么如何来保证主从数据的一致性呢?就是依靠binlog二进制来实现的,比如说现在在主机中新增了一条记录,那么就在binLog中记录一下,从机从binlog中获取记录

MYSQL日志和事务原理_第6张图片 

MYSQL日志和事务原理_第7张图片

redolog的刷盘策略:将redologbuffer中的数据放在redlogfile中

1)假设现在要进行更新操作,那么首先MYSQL会将要更新的数据的表加载到内存中 

2)修改完成之后,先在redologbuffer中做一个记录

3)然后再将内存层面中的redologbuffer中的数据写入到磁盘中的readlogfile;

4)最后进行刷盘;

MYSQL日志和事务原理_第8张图片

MYSQL日志和事务原理_第9张图片

真正的将文件系统cache中的数据刷入到redolog日志中,是由文件系统本身决定的

1)当设置成1的时候,随着事务的提交,redologbuffer中的数据马上就会刷到文件系统缓存中,然后这些数据会从文件系统缓存刷到redlog日志中

2)当设置成0的时候,事务提交,表示不会立即进行刷盘操作,而是等1s之后再进行刷盘操作,innodb会有一个后台线程,每隔1s就会将redo log buffer的内容写到文件系统缓存中然后再来执行刷盘操作

MYSQL日志和事务原理_第10张图片

总结就是:0:延迟写,延迟刷,1:实时写,实时刷,2:实时写,延迟刷

MYSQL日志和事务原理_第11张图片

只要修改数据,redo log buffer就会实时地做记录,参数影响的只是log buffer中的刷盘策略

MYSQL日志和事务原理_第12张图片

MYSQL日志和事务原理_第13张图片

MYSQL日志和事务原理_第14张图片

MYSQL日志和事务原理_第15张图片

undolog日志:
MYSQL日志和事务原理_第16张图片 MYSQL日志和事务原理_第17张图片

MYSQL日志和事务原理_第18张图片

锁:
MYSQL日志和事务原理_第19张图片MYSQL日志和事务原理_第20张图片 MYSQL日志和事务原理_第21张图片

MYSQL日志和事务原理_第22张图片

MYSQL日志和事务原理_第23张图片

MYSQL日志和事务原理_第24张图片

MYSQL日志和事务原理_第25张图片

当在READ COMMITED情况下,ReadView中记录的是读已提交的数据(记录的是已提交事务

,此时Select操作只能读到已经提交的数据

MYSQL日志和事务原理_第26张图片

MYSQL日志和事务原理_第27张图片

MYSQL日志和事务原理_第28张图片MYSQL日志和事务原理_第29张图片 MYSQL日志和事务原理_第30张图片

比如说T1给表中的数据加了一个X锁,不管是T2的事务操作这一行数据加的是X锁还是S锁,实际上都是需要进行阻塞的

写的时候一定要加上排他锁

MYSQL日志和事务原理_第31张图片

你可能感兴趣的:(mysql,数据库)