目录
2.1 MySQL中InnoDB存储引擎对事务隔离级别的支持程度
2.2 应该怎么做才能解决读一致性问题(保证一个事务中前后两次读的数据一致)
3.2 MySQL中InnoDB和MyIsam存储引擎分别支持什么粒度的锁
3.3 共享锁与排它锁、意向共享锁与意向排它锁 的含义与加锁/释放锁方式
3.1 原子性的实现原理:undo log(是一个逻辑日志)
3.2 持久性的实现原理:redo log(是新增数据的备份)
3.2.1 数据更新的流程(redo log 的两阶段提交:prepare阶段与submit阶段)
3.2.2 反面论证为什么 redo log 要进行两阶段提交
B站视频:MySQL事务和锁机制详解:
https://www.bilibili.com/video/BV1x54y1979n?from=search&seid=14928286168592339456
B站视频:深入浅出MySQL两大知识点:事务与锁:
https://www.bilibili.com/video/BV1x54y1979n?from=search&seid=14928286168592339456
B站视频:java 深入理解Mysql锁与事务隔离级别
https://www.bilibili.com/video/BV164411p7nk?p=1
1、事务并发带来的三大问题:脏读、不可重复读、幻读
1.1 脏读问题
【脏读的定义】在一个事务中读取了另外一个事务还没有提交的数据,如果另外一个事务做了数据回滚操作,那么第一个事务读取的数据就是脏数据,这会导致业务出错。这个现象就是脏读。
简单解释:对于两个事务TA和TB,TA读取了 已经被TB更新但是还没有被提交的数据,如果此时TB做了回滚操作,那么TA读取的内容就是脏数据 18。
1.2 不可重复读问题
【不可重复度的定义】在一个事务的前后两次查询中,前后两次查询出来的数据不一致,这可能是因为在前后两次查询的过程中 插入了另外一个事务提交的内容,这个提交的内容可以是:更新了原有的数据,或者是删除了原有的数据。这个现象就是不可重复读。
简单解释:对于两个事务TA和TB,TA读取了一个字段,然后在TB中对该字段做了更新操作并且提交了,TA再次读取该同一个字段时,发现该字段的值和之前的不一样了,是18。
1.3 幻读问题
【幻读的定义】在一个事务的前后两次范围查询中 数据的笔数不一致。例如:事务1查询了几行数据,而另外一个事务2却在此时插入了新的几行数据并且提交了,那么先前的事务1在接下来的同样的范围查询中 就会发现有几行数据是新的,是之前那次查询中所没有的,这个现象就是幻读。
【简单解释】对于两个事务TA和TB,TA从表中读取数据,然后TB进行了insert操作并且提交了,当TA再次使用相同的范围查询时,发现前后两次读取的结果不一致,有新增的数据出现,count=2。
1.4 三大问题的总结
2、事务的四种隔离级别
2.1 MySQL中InnoDB存储引擎对事务隔离级别的支持程度
2.2 应该怎么做才能解决读一致性问题(保证一个事务中前后两次读的数据一致)
3、MySQL中的各种锁
3.1 表锁与行锁的区别
3.2 MySQL中InnoDB和MyIsam存储引擎分别支持什么粒度的锁
(1)innoDB存储引擎:支持行锁与表锁。
(2)MyISAM存储引擎:只支持表锁。
3.3 共享锁与排它锁、意向共享锁与意向排它锁 的含义与加锁/释放锁方式
(1)行级别的锁:共享锁(S锁)与排他锁(X锁)。
(2)表级别的锁:意向共享锁(IS锁)与意向排他锁(IX锁)。
3.3.1 共享锁(S锁、读锁)
3.3.2 排他锁(X锁、写锁)
3.3.3 意向共享锁(IS锁)与意向排它锁(IX锁)
3.3.4 思考:为什么需要表级别的意向锁?
(1)首先,一个事务成功的给一张表加上表锁的前提是:没有任何其他事务已经锁定了该表的任意一行数据。
(2)那么,怎么知道 “没有任何其他事务已经锁定了该表的任意一行数据” 呢 ?这就需要全表扫描去做检测,太费时。
(3)所以,使用意向锁的目的就是 提高加表锁的效率,可以把它当做一个表有没有被锁上的标识。这也就是说,直接看这张表有无意向锁,如果没有,则可以加表锁;如果有,则说明该表已经被其他事务加了表锁,当前事务只能够等待。
3.3.5 锁的作用:锁到底锁住了什么?
主键索引和辅助索引的图解
索引的本质是什么?
聚集索引:索引的逻辑顺序决定了表中数据的存储顺序,所以一个表中一定有一个聚集索引。
带主键的建表SQL语句
记录、间隙、临键的图解
记录锁:锁定记录
间隙锁:锁定范围
临键锁:锁定范围+记录
InnoDB事务隔离级别的实现:RU/S/RR/RC
下面内容来自B站视频:https://www.bilibili.com/video/BV18p4y1D7ag?p=1
1、数据库事务的基本概念
2、事务的四大特点ACID
3、事务ACID的实现原理
3.1 原子性的实现原理:undo log(是一个逻辑日志)
3.2 持久性的实现原理:redo log(是新增数据的备份)
3.2.1 数据更新的流程(redo log 的两阶段提交:prepare阶段与submit阶段)
(1)数据log,日志log。
(2)数据从 进程内存 ——> 操作系统内存 ——> 磁盘,最终落地到磁盘中。
(3)并不是来一条数据就写一次磁盘,而是当数据量达到某一个阈值之后 再一次性做批处理,统一写到磁盘中。
3.2.2 反面论证为什么 redo log 要进行两阶段提交
4、MySQL的隔离级别
RC隔离级别:
RR隔离级别:
隐藏的三列:_rowid、createTime、deleteTime
4.1 并发事务带来的问题:脏读/不可重复读/幻读
4.2 InnoDB的行锁模式与加锁方法
4.2.1 InnoDB行锁的实现方式与SQL演示(重要)
4.3 总结:MyISAM与InnoDB
4.4 MySQL中的死锁演示
select @@autocommit; set autocommit=off; set autocommit=on;
mysql官网:https://dev.mysql.com/doc/refman/5.7/en/explain-output.html
4.5 隔离性的实现原理:锁
4.6 故障及故障恢复