1.讲一下mysql里有哪些锁?
2.数据库的表锁和行锁有什么作用?
3.MySQL两个线程的update语句同时处理一条数据,会不会有阻塞?
4.两条update语句处理一张表的不同的主键范围的记录,一个<10,一个>15,会不会遇到阻塞?底层是为什么的?
5.如果2个范围不是主键或索引?还会阻塞吗?
6.日志文件是分成了哪几种?
7.讲一下binlog
8.UndoLog日志的作用是什么?
9.有了undolog为啥还需要redolog呢?
10.redo log怎么保证持久性的?
1.讲一下mysql里有哪些锁?
S共享锁,X排他锁。间隙锁是开开区间,next-key锁是开闭区间。
2.数据库的表锁和行锁有什么作用?
控制力度,锁冲突发生的可能性,使用场景。
一个适用于大批量,一个适用于频繁单行操作。
3.MySQL两个线程的update语句同时处理一条数据,会不会有阻塞?
会。
如果是两个事务同时更新了 id = 1,比如 update … where id = 1,那么是会阻塞的。因为 InnoDB 存储引擎实现了行级锁。(加X类型的记录锁)
4.两条update语句处理一张表的不同的主键范围的记录,一个<10,一个>15,会不会遇到阻塞?底层是为什么的?
不会。gap lock锁定的范围不同。
5.如果2个范围不是主键或索引?还会阻塞吗?
如果2个范围查询的字段不是索引的话,那就代表 update 没有用到索引,这时候触发了全表扫描,全部索引都会加行级锁,这时候第二条 update 执行的时候,就会阻塞了。
6.日志文件是分成了哪几种?
7.讲一下binlog?
sever层的,用于数据备份和主从复制的。
MySQL 在完成一条更新操作后,Server 层还会生成一条 binlog,等之后事务提交的时候,会将该事物执行过程中产生的所有 binlog 统一写 入 binlog 文件,binlog 是 MySQL 的 Server 层实现的日志,所有存储引擎都可以使用。
binlog 是追加写,写满一个文件,就创建一个新的文件继续写,不会覆盖以前的日志,保存的是全量的日志,用于备份恢复、主从复制;
8.UndoLog日志的作用是什么?
undo log 是一种用于撤销回退的日志,它保证了事务的 ACID 特性中的原子性(Atomicity)。
在事务没提交之前,MySQL 会先记录更新前的数据到 undo log 日志文件里面,当事务回滚时,可以利用 undo log 来进行回滚。
9.有了undolog为啥还需要redolog呢?
undo log是为了保证原子性,而redo log是为了保证持久性。
这和数据库的操作有关系。在操作执行时,会把先在buffer pool上记录,然后每隔一段时间写入磁盘。如果在写入磁盘之前,服务器发生了宕机,那么buffer pool里的数据就是销毁,因此需要再写入buffer pool之后,将这些操作写入redo log。这样,如果发生宕机等情况,数据库的重启时会根据redo log恢复到宕机前的状态。保证持久性。
10.redo log怎么保证持久性的?
Write-ahead logging(WAL)。
Redo log的顺序写入。
Checkpoint机制。
这里的顺序写入如何实现的看了知乎的问答,发现都没回答。。