目录
27.是否使用过select for update?会产生哪些操作?
33.Mysql日志是否实时写入磁盘? bin log刷盘机制是如何实现的?redo log刷盘机制是如何实现的? undo log刷盘机制是如何实现的?
34.MySQL的binlog有有几种录入格式?分别有什么区别?
35.Mysql集群同步时为什么使用binlog?优缺点是什么?
1.什么是数据库事务?事务的特性是什么?
事务:
-
是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;
-
这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;
-
事务是一组不可再分割的操作集合(工作逻辑单元)
事务都有 ACID 特性
2.什么是ACID?
1 、原子性 atomicity
过程的保证
只做一个步骤
1 给钱
2 去买
3 交回来
事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做
2 、一致性 consistency
结果的保证
保证要吃完 刚张嘴挂了,失去一致性
事 务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。
3 、隔离性 isolation
并发事务互相干扰
不被干扰 刚张嘴别人塞了东西
一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
4 、持续性 永久性 durability
保存 吃到肚子里
也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。
3.并发事务会有哪些问题?
多个事务并发执行一定会产生相互争夺资源的问题
4.什么是 脏读、丢失修改、不可重复读、幻读
脏读(Dirty read)
是一个事务在处理过程中读取了另外一个事务未提交的数据
当一个事务正在访问数据并且对其进行了修改,但是还没提交事务,这时另外一个事务也访问了这个数据,然后使用了这个数据,因为这个数据的修改还没提交到数据库,所以另外一个事务读取的数据就是“脏数据”,这种行为就是“脏读”,依据“脏数据”所做的操作可能是会出现问题的。
修改丢失(Lost of modify)
是指一个事务读取一个数据时,另外一个数据也访问了该数据,那么在第一个事务修改了这个数据之后,第二个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失,这种情况就被称为*修改丢失
不可重复读(Unrepeatableread)
*指在一个事务内多次读取同一数据,在这个事务还没结束时,另外一个事务也访问了这个数据并对这个数据进行了修改,那么就可能造成第一个事务两次读取的数据不一致,这种情况就被称为*不可重复读。
幻读(Phantom read)
是指同一个事务内多次查询返回的结果集总数不一样(比如增加了或者减少了行记录)。
幻读与不可重复读类似,幻读是指一个事务读取了几行数据,这个事务还没结束,接着另外一个事务插入了一些数据,在随后的查询中,第一个事务读取到的数据就会比原本读取到的多,就好像发生了幻觉一样,所以称为**幻读**。
5.不可重复读和幻读有什么区别?
不可重复读 针对的是一份数据的修改
幻读 针对的是行数修改
6.Mysql是如何避免事务并发问题的?
避免事务并发问题是需要付出性能代价的,此时和分布式系统设计一样(CAP定理及base理论),为了保证一致性就一定会牺牲性能,要做取舍
在mysql内部通过加锁的方式实现好了解决方案可供选择,就是配置事务隔离级别
7.什么是事务隔离级别?
8.默认的级别是什么?
MySQL InnoDB
存储引擎默认的事务隔离级别是可重复读(REPEATABLE-READ)
MySQL 5.7 SELECT @@tx_isolation; MySQL 8.0 SELECT @@transaction_isolation;
9.如何选择事务隔离级别?
隔离级别越低,事务请求的锁越少相应性能也就越高,如没有特殊要求或有错误发生,使用默认的隔离级别即可,如果系统中有高频读写并且对一致性要求高那么就需要比较高的事务隔离级别甚至串行化。
10.靠缓存可以提升高事务隔离级别的性能吗?
提升事务级别的目的本质是提供更高的数据一致性,如果前置有缓存,那么缓存只能提供高效读并不能保证数据及时一致性,相反的我们还需要对缓存管理有额外的开销。
11.Mysql事务隔离是如何实现的?
隔离的实现主要是读写锁和MVCC
12什么是一致性非锁定读和锁定读?
锁定读:使用到了读写锁
读写锁是最简单直接的的事务隔离实现方式
-
每次读操作需要获取一个共享(读)锁,每次写操作需要获取一个写锁。
-
共享锁之间不会产生互斥,共享锁和写锁之间、以及写锁与写锁之间会产生互斥。
-
当产生锁竞争时,需要等待其中一个操作释放锁后,另一个操作才能获取到锁。
锁机制,解决的就是多个事务同时更新数据,此时必须要有一个加锁的机制
-
行锁(记录锁):解决的就是多个事务同时更新一行数据
-
间隙锁:解决的就是多个事务同时更新多行数据
下列操作属于锁定读
select ... lock in share mode select ... for update insert、update、delete
非锁定读
v10 -> age=18
v11 ->age=19
v12 ->age=15
使用mvcc 多版本控制实现
13.说一下MVCC内部细节
MySQL :: MySQL 5.7 Reference Manual :: 14.3 InnoDB Multi-Versioning
Multi-Version Concurrency Control 多版本并发控制,MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问
InnoDB是一个多版本的存储引擎。它保存有关已更改行的旧版本的信息,以支持并发和回滚等事务特性。这些信息存储在一个称为回滚段的数据结构中的系统表空间或undo表空间中。参见第14.6.3.4节“撤消表空间”。InnoDB使用回滚段中的信息来执行事务回滚所需的撤消操作。它还使用这些信息构建行的早期版本,以实现一致的读取
MVCC 的实现依赖于:隐藏字段、Read View、undo log
隐藏字段
-
A 6-byte
DB_TRX_ID
用来标识最近一次对本行记录做修改 (insert 、update) 的事务的标识符 ,即最后一次修改本行记录的事务 id。 如果是 delete 操作, 在 InnoDB 存储引擎内部也属于一次 update 操作,即更新行中的一个特殊位 ,将行标识为己删除,并非真正删除。 -
A 7-byte
DB_ROLL_PTR
回滚指针,指向该行的 undo log 。如果该行未被更新,则为空. -
A 6-byte
DB_ROW_ID
如果没有设置主键且该表没有唯一非空索引时,InnoDB
会使用该 id 来生成聚簇索引.
Read View
不同的事务隔离级别中,当有事物在执行过程中修改了数据(更新版本号),在并发事务时需要判断一下版本链中的哪个版本是当前事务可见的。为此InnoDB有了ReadView的概念,使用ReadView来记录和隔离不同事务并发时此记录的哪些版本是对当前访问事物可见的。
undo log
除了用来回滚数据,还可以读取可见版本的数据。以此实现非