链接:https://pan.baidu.com/s/1mw4sej8BzdHNCkaib4ebeg
提取码:j2qu
1 事务的四个特点是什么?他们是如何实现的?
ACID-原子性、一致性、隔离性和持久性。
ACID | 原理 |
原子性 | undolog |
一致性 | 通过其他三个特性来实现的 |
隔离性 | 锁+MVCC |
持久性 | redolog |
2 MySQL的常见日志分别有什么作用?
binlog:保证多台MySQL服务器数据的一致性
errorlog:错误日志
slowlog:慢查询日志
relaylog:中继日志
作用:在进行主从同步的过程中master节点将DML的相关操作记录在binlog中,然后通过IO Thread线程将信息更新到slave节点的relaylog日志中,在slave节点中通过SQL Thread线程读取relaylog中的日志保证master和slave节点数据一致。
undolog:回滚日志-保证一致性--记录历史版本的数据
作用:用于MySQL数据库的事务回滚
当需要回滚时候,直接调用历史版本的数据,然后进行回滚。
redolog:前滚日志-解决持久性问题,将数据从内存写入到磁盘中。
可以将随机IO改善为顺序IO。又称预写日志。
binlog、errorlog、slowlog和relaylog归属server层
undolg和redolog归属存储引擎层。
3 什么是二阶段提交,如何保证宕机时数据的一致性?
二阶段提交问题:解决的是主从同步时,当redolog和binlog日志同时存在时先写谁后写谁?
如果先写binlog日志,主从节点都记录了binlog日志后,主节点回滚了,从节点却没有回滚,那么就出现了主从节点数据的不一致性。
如果先写redolog日志 +1操作,在binlog还没有写的时候,主节点断电了。将主节点的binlog同步到了从节点,这时候出现了数据不一致性。
二阶段提交:在redolog设置一个标记位。
先写redolog此时为prepare状态,然后在写binlog,binlog写完后,将redolog状态改为commit状态。
4 MVCC如何实现多版本并发控制?如何解决读写冲突问题?
MVCC:多版本并发控制,是为了解决并发读写问题存在的。
如何解决呢?使用下面三部分
- 隐藏字段
- undolog
记录历史状态数据:会形成一个链表,链首表示最新的旧记录,链尾表示最旧的旧记录
- readview:表示事务进行快照读操作的时候产生的读视图,有三个字段。
注意:
在RC隔离级别的时候,每一次进行快照读都会生成新的ReadView。
在RR隔离级别的时候,只有第一次快照读会生成readView,其余都是沿用第一次快照读生成的readView
5 MySQL中的幻读是什么?如何解决幻读问题?
幻读就是:在一个事务中,当前读和快照读一起使用才会造成幻读现象。
最后只能加锁解决幻读问题了,详见《 MySQL进阶-锁机制详解》