第六章 锁
6.1 lcok 与 latch
6.2 Innodb 的锁
6.2.1 类型
S lock X lock 行锁
意向锁, 对细粒度的操作加锁,需要对 粗粒度 加上意向锁。
6.2.2 一致性非锁定读
行被加上了 X lock ,此时不等待锁的释放,而是读取 快照 数据(undo 之前的版本数据)。
6.2.3 一致性锁定读
6.2.4 自增长 主键
6.2.5 外键
父表需要加S锁。
6.3 锁的算法
6.3.1 行锁三种算法
唯一索引,适合使用 record lock,锁记录,不会锁范围,提高并发。
6.3.2 解决 幻读 问题
6.4 锁问题
6.4.1 脏读
事务的隔离级别---一个事务可以读到另外一个事务尚未提交的的数据
6.4.2 不可重复读
6.4.3 丢失更新
6.5 阻塞
举例: 事务 进行了数据的 范围锁定,但是事务一直没有提交,另外开启一个事务,需要访问被锁定部分数据。
6.6 死锁
问题 : 外键不加索引会引起死锁???
6.7 锁升级
会影响并发性能
第七章 事务
ACID 四个特性
7.1 事务
7.1.1 认识
原子性:一次操作要么全部成功,要么全部失败
一致性:事务前后没有破坏数据库的约束性质,前后状态是一致的(较为抽象)
隔离性:事务之间是不会相互影响的,但是这个取决于事务的隔离级别,通过MVCC实现隔离级别
持久性: 事务操作后的结果是可以永久存在的,即使宕机也能恢复数据
7.1.2 分类
具体的细节见资料,自己只是看了一遍
7.2事务的实现
7.2.1 redo
记录对数据的操作,有固定的格式。
7.2.2 undo
回滚 undo只是逻辑日志。
回滚执行的是相反的操作,并不是直接恢复到事务开始前的状态。
undo 实现了MVCC,即非锁定读,在一行记录被锁定时,可以读取该行之前的版本数据。
undo 日志也需要 redo的维护。
7.2.3 purge
最终完成 delete update操作,比如在undo中,逻辑删除一个记录是打上一个标记,由purge来处理。
因为支持MVCC,所以记录不能在事务提交时立即进行处理得到结果,因为此时可能有其他事务正在引用该行记录,所以可以利用记录之前的版本(但是这个有个问题就是,当前的记录与新的事务调用之前版本的记录如何进行的合并???????)
7.3 - 7.5
7.6 事务的隔离级别
非提交读 炸成
提交读
可重复读
序列化 完美
7.7 分布式事务
7.8 不好的事务使用习惯
7.8.1 在循环中提交事务
7.8.2 自动提交
7.8.3 自动回滚
7.9 长事务