0%

数据库


事务

ACID

  • 原子性:事务被视为不可分割的最小单元,事物的全部操作要么全部提交,要么全部失败
  • 一致性:数据库在事务执行的前后都保持一致状态。在一致状态下,不同事务对同一个数据的读取结果是相同的
  • 隔离性:一个事务所做的修改在提交前,对其它事务是不可见的
  • 持续性:事务对数据库的修改是永久的

并发一致性问题

  • 丢失修改
  • 脏读
  • 不可重复读
  • 幻读

封锁粒度

表级、行级

  • 互斥锁(X锁,写锁)
  • 共享锁(S锁,读锁)

兼容关系

X S
X N N
S N Y

三级封锁协议

  • 一级封锁协议:事务在修改数据前需要加X锁,事务结束后释放
    • 可以解决丢失修改的问题
  • 二级封锁协议:在一级封锁协议的基础上,数据在读取数据时要为其加S锁,读取完之后释放
    • 可以解决脏读问题
  • 三级封锁协议:在二级封锁协议的基础上,事务在读取数据前要为其添加S锁,事务完成后释放S锁
    • 可以解决不可重复读问题

两端锁协议

事务的加锁和解锁分两个阶段进行

隔离级别

隔离级别能够解决的问题

脏读 不可重复读 幻读
未提交读 × × ×
读提交 × ×
可重复读 ×
可串行化

mysql事务默认的隔离级别是可重复读

MVCC多版本并发控制

写操作更新最新的版本快照,读操作读取旧的版本快照
MVCC规定只能读取已经提交的快照

索引

B+树

与红黑树比较

  • B+树具有更低的树高
  • 磁盘访问原理,一个物理块可以存储更多的节点
  • 减少预读特性

索引的优点

  • 可以提高数据检索的效率,降低数据库的IO成本
  • 通过索引列对数据进行排序,降低了CPU的消耗

索引的缺点

  • 占用磁盘空间
  • 降低更新表的效率,插入删除会破坏平衡性,需要对树进行分裂、合并、旋转等操作来维护平衡性

索引分类

单列索引

  • 普通索引:没有任何限制
  • 唯一索引:索引列中的值唯一,允许空值
  • 主键索引:特殊的唯一索引,不允许空值

组合索引

对多个列进行索引