1.基于封锁的并发控制方法
并发调度的正确性:
- 当且仅当在这个并发调度下所得到的新数据库结果与分别串行地运行这些事务所得的新数据库完全一致,则说调度是正确的
- 冲突可串行?可串行性?并发调度的正确性
- 怎么样产生一个正确的并发调度?也就是怎么产生一个冲突可串行化的调度?主要分为:基于锁的方法金额基于撤回的方法
2.什么是锁
锁” 是控制并发的一种手段
- 每一数据元素都有一唯一的锁
- 每一事务读写数据元素前,要获得锁。
- 如果被其他事务持有该元素的锁,则要等待。
- 事务处理完成后要释放锁。
L
i
(
A
)
:
事
务
T
i
对
数
据
元
素
A
加
锁
L_i(A) : 事务T_i 对数据元素A加锁
Li?(A):事务Ti?对数据元素A加锁
U
i
(
A
)
:
事
务
T
i
数
据
元
素
A
解
锁
U_i(A) : 事务T_i 数据元素A解锁
Ui?(A):事务Ti?数据元素A解锁 - 调度器可利用锁来保证冲突可串行性
- 锁本身并不能保证冲突可串行性。
- 锁为调度提供了控制的手段。但如何用锁,仍需说明。—不同的协议
3.封锁协议之锁的类型
排他锁X (exclusivelocks),读锁
共享锁S (sharedlocks),写锁
更新锁U (Updatelocks)
增量锁I (Incrementallock)
封锁协议需要考虑什么?
- 封锁协议之相容矩阵
封锁协议之加锁/解锁时机
-
0级协议(0-LP) -
1级协议(1-LP) -
2级协议(2-LP) -
3级协议(3-LP)
4.SQL之隔离性级别(允许程序员选择使用)
读未提交 (read uncommitted) —相当于0级协议 读已提交 (read committed)—相当于1级 可重复读(repeatable read) —相当于2级协议 可串行化(serializable) —相当于3级协议
幻读指的是事务不是串行发生时的一种现象,是事务A读取了事务B已提交的新增数据。
- 例如第一个事务对一个表的所有数据进行修改,同时第二个事务向表中插入一条新数据。那么操作
第一个事务的用户就发现表中还有没有修改的数据行,就像发生了幻觉一样。解决幻读的方法是增加范围锁( range lock)或者表锁 - 小结
锁协议之封锁粒度(LOCKING GRANULARITY) - 封锁粒度是指封锁数据对象的大小。
- 粒度单位:属性值->元组->元组集合->整个关系->整个DB某索引项 ->整个索引
- 由前往后: 并发度小,封锁开销小;
- 由后往前: 并发度大,封锁开销也大
- 当前的数据库都是在元组上进行加锁解锁
封锁协议需要考虑什么?
5.两段封锁协议
两段封锁协议是一种基于锁的并发控制方法 两段封锁协议(2PL: two-Phase Locking protocal)
- 读写数据之前要获得锁。每个事务中所有封锁请求先于任何一个解锁请求
- 两阶段:加锁段,解锁段。加锁段中不能有解锁操作,解锁段中不能有加锁操作
两段封锁协议是可以保证冲突可串行性的!
- 两段锁协议是可能产生“死锁”的协议。
如何消除死锁?强制撤销一个事务。
|