ref: https://blog.csdn.net/whyangwanfu/article/details/1926675
可串行化
事务集并发执行产生的任何调度的执行效果等价于这些事务按某个串行顺序执行的结果。
可串行化可通过并发控制机制(两阶段封锁协议)来保证。
冲突可串行化
只考虑read(X)与write(X)操作。
若一个调度S通过一系列非冲突指令交换(交换两条连续的不冲突的指令)与一个串行调度冲突等价,则调度S是冲突可串行化的。视图可串行化
比冲突可串行化宽松。
可恢复性
- 可恢复调度
对于每对事务Ti与Tj,Tj读取了Ti写的数据,则Ti先于Tj提交 - 无级联调度
对于每对事务Ti与Tj,Tj读取了Ti写的数据,则Ti先于Tj的读取前提交
级联调度会因一个事务故障导致一系列事务回滚
隔离性的实现
只产生 冲突可串行化或视图可串行化且无级联的调度
可串行化判定
- 冲突可串行化检测
以事务为顶点,构造有向图,判环
- Ti 中的read(X)在Tj中的write(X)之前
- Ti 中的write(X)在Tj中的read(X)之前
- Ti 中的write(X)在Tj中的write(X)之前
满足以上任意一条则构造一条边,Ti -> Tj
- 视图可串行化检测
NP完全问题
并发控制
锁的授予
- 共享锁S,读锁
- 排他锁X,写锁
Q:如何避免申请排他锁的事务饿死
A:按申请锁的顺序排序授权加锁
两阶段封锁协议
- 事务释放锁后不能获得新锁
保证冲突可串行化,不保证不发生死锁,事务回滚也可能级联 - 另有严格两阶段封锁协议(避免级联回滚)、强两阶段封锁协议(在该协议下,事务可按提交的顺序串行化),多数数据库采用这两种协议之一
锁管理器
I为数据项,T为事务,其中已授予锁的为黑方块
多粒度封锁
某些情况需要将多个数据项聚为一组,作为同步单元。如访问整个数据库,对每个数据执行加锁操作很费时。
意向锁
将数据库组织为一棵树。
事务对一个数据加S锁时,对其祖先节点加IS锁,IS表示有子节点拥有S锁
事务对一个数据加X锁时,对其祖先节点加IX锁
同一事务可对一节点同时加S锁和IX锁,即SIX锁
索引结构中的并发
对事务而言,对一个索引查找两次,并在期间发现索引结构发生了变化,是完全可以接受的,只要索引查找返回正确的元组集即可。
B+树:蟹行协议
- 搜索:用S锁锁住根节点,沿树向下搜索,在子节点获得S锁后,释放父节点的S锁。
- 插入删除:通过搜索找到叶节点,用X锁锁住该叶节点执行插入删除操作。
- 分裂合并:需要分裂一个节点或与兄弟节点合并时,用X锁锁住其父节点。