封锁是实现并发控制的重要技术

一致性问题

读脏数据

  • 事务读取了另一个事务正在操作的数据。

幻读

  • 事务读取或修改某种类型数据时另一事务正插入/删除数据,可能导致当前操作结果有误。

不可重复读

  • 一个事务对一条数据读取两次或以上。

丢失修改

  • 事务对数据的修改被并发事务对相同数据的修改覆盖。

封锁

  • X锁(排他锁、写锁):X锁不能加在有任何锁的数据对象上,加有X锁的数据对象不能再加任何锁。
  • S锁(共享锁、读锁):一个数据对象可以加若干个S锁。

锁的相容性:

S X
S
X
封锁协议 可以防止的一致性问题 描述
丢失修改 读脏数据 不可重复读 幻读
一级封锁协议 事务修改数据时必须:加X锁→修改数据→事务结束→释放X锁
二级封锁协议 事务修改数据时必须:加X锁→修改数据→事务结束→释放X锁
事务读取数据时必须:加S锁→读取数据→释放S锁
三级封锁协议 事务修改数据时必须:加X锁→修改数据→事务结束→释放X锁
事务读取数据时必须:加S锁→读取数据→事务结束→释放S锁

解决幻读需要四级封锁协议……

活锁

  • 系统长时间不允许某个事务加锁导致该事务一直等待

死锁

  • 两个事务各需要对多条数据加锁,当它们同时申请对方已经加锁的数据时只能互相等待。

死锁诊断

  • 超时法:设置事务最大处理时间,如果超时就认为是死锁。
  • 等待图法:每个运行的事务作为一个节点,从每个等待中的事务到其所等待的事务连接一条有向边,如果成环则死锁。

2PL

两段锁协议。事务遵守两段锁协议是事务可串行化调度的充分非必要条件
事 务 遵 守 两 段 锁 协 议 ⇒ 事 务 可 串 行 化 调 度 事务遵守两段锁协议\Rightarrow 事务可串行化调度

何谓两段

  • 扩展阶段:事务对数据读写之前必须申请对其加锁;
  • 收缩阶段:事务释放任一锁之后就不能再申请加锁了。

粒度

即封锁对象的大小。封锁对象可以是逻辑单元或物理单元。封锁粒度越大并发度越小(一个锁直接把库锁住了并发量肯定不大,但是没必然联系,封锁粒度很小但事务每天就几个,也没啥并发)。

猜你喜欢

转载自blog.csdn.net/dscn15848078969/article/details/112058413