
事务
ACID
- 原子性:事务被视为不可分割的最小单元,事物的全部操作要么全部提交,要么全部失败
- 一致性:数据库在事务执行的前后都保持一致状态。在一致状态下,不同事务对同一个数据的读取结果是相同的
- 隔离性:一个事务所做的修改在提交前,对其它事务是不可见的
- 持续性:事务对数据库的修改是永久的
并发一致性问题
- 丢失修改
- 脏读
- 不可重复读
- 幻读
封锁粒度
表级、行级
- 互斥锁(X锁,写锁)
- 共享锁(S锁,读锁)
兼容关系
| X | S | |
|---|---|---|
| X | N | N |
| S | N | Y |
三级封锁协议
- 一级封锁协议:事务在修改数据前需要加X锁,事务结束后释放
- 可以解决丢失修改的问题
- 二级封锁协议:在一级封锁协议的基础上,数据在读取数据时要为其加S锁,读取完之后释放
- 可以解决脏读问题
- 三级封锁协议:在二级封锁协议的基础上,事务在读取数据前要为其添加S锁,事务完成后释放S锁
- 可以解决不可重复读问题
两端锁协议
事务的加锁和解锁分两个阶段进行
隔离级别
隔离级别能够解决的问题
| 脏读 | 不可重复读 | 幻读 | |
|---|---|---|---|
| 未提交读 | × | × | × |
| 读提交 | √ | × | × |
| 可重复读 | √ | √ | × |
| 可串行化 | √ | √ | √ |
mysql事务默认的隔离级别是可重复读
MVCC多版本并发控制
写操作更新最新的版本快照,读操作读取旧的版本快照
MVCC规定只能读取已经提交的快照
索引
B+树
与红黑树比较
- B+树具有更低的树高
- 磁盘访问原理,一个物理块可以存储更多的节点
- 减少预读特性
索引的优点
- 可以提高数据检索的效率,降低数据库的IO成本
- 通过索引列对数据进行排序,降低了CPU的消耗
索引的缺点
- 占用磁盘空间
- 降低更新表的效率,插入删除会破坏平衡性,需要对树进行分裂、合并、旋转等操作来维护平衡性
索引分类
单列索引
- 普通索引:没有任何限制
- 唯一索引:索引列中的值唯一,允许空值
- 主键索引:特殊的唯一索引,不允许空值
组合索引
对多个列进行索引