Variants of the predicate-locking technique can be used for eliminating the phantom phenomenon under the other concurrency-control protocols presented in this chapter. However, many database systems, such as PostgreSQL (as of version 8.1) and (to the best of our knowledge) Oracle (as of version 10g) do not implement index locking or predicate locking, and are vulnerable to non-serializability due to phantom problems even if the isolation level is set to serializable.
出处:Database System concepts 5th ED, Abraham Silberschatz / Henry Korth / S. Sudarshan,2005
B.原文的翻译
并发控制
锁定对应关系数据项(或锁定整个索引)的主要缺点在于其低并发性——在一个关系中插入不同元组的两个事务无法并发执行。
索引锁定技术是弥补这一缺陷的更好解决方案,索引锁定技术避免锁定整个索引。在关系中插入元组的任何事务必须在每个保持关系的索引中插入信息。我们通过对索引实施锁协议,消除幻影现象。为简单起见,我们在此仅考虑B+tree 索引(多路索引树)。
正如我们在第11章所见,每个检索关键字值与索引叶子节点相关。一个查询通常利用一个或多个索引访问一个关系。插入操作必须将新元组插入关系中的所有指索引中。在我们的案例中,我们假设:系老师名称存在一个索引,则T31必须修改为含有关键词“Physics物理”的叶节点。若T30读取相同的叶节点,定位与“物理系”相关的所有元组,则T30和T31将在那个叶节点上出现冲突。
索引锁协议充分利用关系索引的有效性,将幻影现象的实例转变成索引叶子节点的锁冲突。锁协议操作如下:
•每个关系至少要有一个索引;
•只有通过关系的一个或多个索引首次搜索到相关关系元组之后,事务Ti才能对其予以访问。基于索引锁协议的目的,关系扫描被视为扫描一个索引的所有叶子;
•执行一个查询(无论是范围查询还是点查询)事务Ti必须获得其访问所有索引叶子节点的一个共享锁;论文网
•在未更新关系r的所有索引前提下,事务Ti不得插入/删除/更新关系r中的元组ti。此类事务必须获得“受插入/删除/更新操作影响的所有索引叶子节点”的排它锁。对于插入操作和删除操作而言,受影响的叶子节点是“那些(插入后或删除前)包含搜索关键元组值”的节点。对于更新操作而言,受影响的叶子节点是“那些(修改之前)包含搜索关键字旧值”的节点,以及“那些(修改之后)包含搜索关键字新值”的节点;
•元组锁还是按正常操作;
•必须严格遵守两段锁协议规则
注意:索引锁协议并没有解决索引内部节点的并行控制。在第15.10章节,我们将进一步介绍并行控制索引的技术,该技术将最大程度减少锁冲突。
锁住一个索引叶子节点可以阻止对该节点的任何更新操作,及时这种更新不会与谓词产生实质性冲突。在第15.10章节,我们将介绍一种变形锁,即所谓的“关键值锁”,这种锁将最大程度减少此类错误锁冲突。此外,这种锁也属于索引并行控制的范畴。
正如第14.10章节所述,基于系统底层的查询处理决策,系统在处理不同事务时可能会存在冲突。而这种冲突与“用户水平对两个事务涵义的理解”不相关。并行控制的一种替代方案在于:在一个查询操作中获得谓词的共享锁(如:在教师关系中插入谓词“工资salary > 90000”)。随后,必须检查关系的插入和删除,看看它们是否满足这一谓词条件。若满足,则将出现锁冲突,迫使插入/删除操作一直排队等待,直至谓词锁被解锁。对于更新操作而言,必须检查元组的初始值和终值是否与该谓词发生冲突。此类冲突的插入/删除/更新操作将影响谓词条件选择出的元组集合,同时,此类冲突将阻止并行执行“获取(共享)谓词锁”的查询操作。我们把上述协议称为“谓词锁”。与索引所协议相比,谓词锁的成本过高,且不会带来重大附加好处,因此在实践中不使用谓词锁。