一. 事务
指逻辑上的一组操作,组成这组操作的各个单元,
要么全部成功,要么全部失败.
四大特性
原子性 : 指事务中的所有操作,要么全部完成,要么全部不完成.
一致性 : 在事务开始和完成时,数据都必须保持一致性的状态[中间状态的数据对外部不可见]
张三向李四转账100元,保证张三账户减少100元,而此时又没有向李四账户添加,一致性就是保证这种中间状态数据对外部不可见,只有最初状态和最终状态对外部可见.
隔离性 : 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库时独立的;[适当的破坏一致性来提升性能与并行度 例如:实现最终一致~=读未提交]
持久性:事务提交后,对系统的影响是永久的
一致性与隔离性: 为了实现一定的并发性,隔离性通过破坏强一致性提升性能和并行度,实现最终一致
并发事务可能出现的问题
- 脏读 : 一个事务一对数据进行了修改,但是修改还未提交到数据库
中,另一个事务二使用了这个数据,事务一如果之后在对数据进行了修改,事务二读到的数据就是脏数据.
- 不可重复读 : 指一个事务内多次读取同一数据
,事务二在其两次读取数据之间对数据进行修改,导致两次读取数据不相同.
- 幻读: 指的是事务一在开始读取到一些数据,但是另一个并发事务二删除了几行数据,事务一再次查询找不到,这样就发生了幻读.
不可重复读与幻读区别 :
不可重复读的重点是修改
,幻读的重点是在于新增或者删除.
二.索引-InnoDb的页
索引是对数据库中一列或者多列的值进行排序的一种结构. 索引的作用相当于图书的目录.
将无序的数据转换为有序的数据
InnoDb的页
mysql的基本存储结构是页
1. 页中的存储
在存储数据的时候,记录会存储到User Records部分
,新页面形成的时候不存在User Records
,再插入一条记录的时候,会从Free Space
中去申请一块符合该记录大小的空间并划分到User Records
中,当Free Space
被User Records
完全替换之后,也就意味着当前页使用完毕.[如果再有新的记录插入,需要申请新的页]
-
各个数据页可以组成一个双向链表
在File Header中记录当前页的上一个页和当前页的下一个页
-
每个数据页中的记录又可以组成一个单向链表
- 每个数据页都会为存储在它里面的记录生成一个页记录[
User Records
]
- 每个数据页都会为存储在它里面的记录生成一个页记录[
-
同时会为页记录对应主键生成对应的页目录也成为槽[
spot
]放在Page Directory
里面
2. 这些槽(分组)是什么?又是怎么生成的呢?
序号: 分成的组的编号
偏移值: 代表当前组的地址偏移量
- 对于
最小记录
的分组只能有1条记录
,对于最大记录
所在的分组只能有1~8
条 - 初始状态下,一个数据页里面只有最小记录和最大记录[伪记录] ,所以有
两个分组[槽]
- 之后插入的每条记录都会插入到最大记录中去,直到最大记录的组的记录数
等于8
- 如果最大记录组中的记录数等于8,并且还有记录插入,就会
将最大记录所在组平均分裂成两个组
,这时的最大记录的组的记录数只剩下4个,然后向最大记录的组中添加新的记录
3. 索引在数据页怎样查找的?
-
通过二分法确定该记录所在的槽
-
然后通过记录的next_record 属性组成的链表遍历查找该槽的各个记录.
4. 如何保证页从内存同步到磁盘的完整性?
- 在File Trailer 中
前四个字节表示校验和
- 与File Header中的校验和相对应,如果页在内存中修改了,在同步之前要把它的校验和计算出来,因为
File Header
在页面的前面,所以会首先被同步
到硬盘中,当完全写完
时,校验和也会被写到页的尾部,如果完全同步成功
,尾部和头部的校验和是完全相同
,反之则中间出了错[断电情况或者其他]