📅  最后修改于: 2021-01-07 05:28:41             🧑  作者: Mango
并发控制技术可确保同时执行多个事务,同时保持事务的ACID属性和时间表中的可序列化性。
在本章中,我们将研究并发控制的各种方法。
基于锁定的并发控制协议使用锁定数据项的概念。锁是与数据项关联的变量,它确定是否可以对该数据项执行读/写操作。通常,使用锁兼容性矩阵,该矩阵指出一个数据项是否可以同时被两个事务锁定。
基于锁定的并发控制系统可以使用一阶段或两阶段锁定协议。
在这种方法中,每个事务在使用前都会锁定一个项目,并在使用完毕后立即释放该锁定。此锁定方法可提供最大的并发性,但并不总是强制执行可序列化性。
在这种方法中,所有锁定操作都在第一次锁定释放或解锁操作之前。交易包括两个阶段。在第一阶段,事务仅获取其所需的所有锁,而不会释放任何锁。这称为扩展或增长阶段。在第二阶段,事务释放锁,并且无法请求任何新锁。这称为收缩阶段。
遵循两阶段锁定协议的每个事务都可以序列化。但是,此方法在两个冲突的事务之间提供了较低的并行度。
基于时间戳的并发控制算法使用事务的时间戳来协调对数据项的并发访问,以确保可串行性。时间戳是DBMS赋予事务的唯一标识符,代表事务的开始时间。
这些算法可确保事务按照其时间戳指示的顺序提交。较早的事务应在较年轻的事务之前提交,因为较早的事务在较早的事务之前进入系统。
基于时间戳的并发控制技术会生成可序列化的时间表,以便按参与交易的时间顺序排列等效的串行时间表。
一些基于时间戳的并发控制算法是-
基于时间戳的排序遵循三个规则以增强可序列化性-
访问规则-当两个事务尝试同时访问同一数据项时,对于冲突的操作,优先级较高的事务。这将导致较年轻的事务等待较早的事务首先提交。
延迟交易规则-如果较早的交易已写入数据项,则不允许较早的交易读取或写入该数据项。该规则可防止较早的事务在已提交较新的事务之后进行提交。
较年轻的事务规则-较年轻的事务可以读取或写入已由较早的事务写入的数据项。
在冲突率低的系统中,验证每个事务的可串行性的任务可能会降低性能。在这些情况下,可序列化性测试被推迟到提交之前。由于冲突率低,因此中止不可序列化的事务的可能性也较低。这种方法称为乐观并发控制技术。
在这种方法中,交易的生命周期分为以下三个阶段:
执行阶段-事务将数据项提取到内存并对其执行操作。
验证阶段-事务执行检查以确保将其更改提交到数据库可通过可序列化性测试。
提交阶段-事务将内存中的已修改数据项写回磁盘。
该算法在验证阶段使用三个规则来增强可序列化性-
规则1-给定两个事务T i和T j ,如果T i正在读取T j正在写入的数据项,则T i的执行阶段不能与T j的提交阶段重叠。 T j只有在T i完成执行后才能提交。
规则2-给定两个事务T i和T j ,如果T i正在写入T j正在读取的数据项,则T i的提交阶段不能与T j的执行阶段重叠。 T J只能启动后T I已经承诺执行。
规则3-给定两个事务T i和T j ,如果T i正在写入T j也正在写入的数据项,则T i的提交阶段不能与T j的提交阶段重叠。只有在T i已经提交之后,T j才能开始提交。
在本节中,我们将看到如何在分布式数据库系统中实现上述技术。
分布式两相锁定的基本原理与基本两相锁定协议相同。但是,在分布式系统中,有些站点被指定为锁管理器。锁管理器控制来自事务监视器的锁获取请求。为了在各个站点中加强锁管理器之间的协调,至少一个站点有权查看所有事务并检测锁冲突。
根据可以检测到锁定冲突的站点数量,分布式两阶段锁定方法可以分为以下三种类型:
集中式两阶段锁定-在这种方法中,一个站点被指定为中央锁定管理器。环境中的所有站点都知道中央锁管理器的位置,并在交易期间从中获取锁。
主副本两阶段锁定-在这种方法中,许多站点被指定为锁定控制中心。这些站点中的每一个都有责任管理一组定义的锁。所有站点都知道哪个锁控制中心负责管理哪个数据表/片段项目的锁。
分布式两阶段锁定-在这种方法中,有许多锁定管理器,其中每个锁定管理器控制存储在其本地站点的数据项的锁定。锁管理器的位置基于数据分发和复制。
在集中式系统中,任何事务的时间戳由物理时钟读数确定。但是,在分布式系统中,任何站点的本地物理/逻辑时钟读数都不能用作全局时间戳,因为它们不是全局唯一的。因此,时间戳包含站点ID和该站点的时钟读数的组合。
为了实现时间戳排序算法,每个站点都有一个调度程序,为每个事务管理器维护一个单独的队列。在交易过程中,交易管理器将锁定请求发送到站点的调度程序。调度程序以递增的时间戳顺序将请求放入相应的队列。从请求队列的时间戳开始,即从最旧的队列开始,对请求进行处理。
另一种方法是创建冲突图。为此交易定义了类别。事务类包含两组数据项,分别称为读取集和写入集。如果事务的读取集是该类的读取集的子集,而事务的写入集是该类的写入集的子集,则该事务属于特定的类。在读取阶段,每个事务针对其读取集中的数据项发出其读取请求。在写阶段,每个事务都会发出其写请求。
将为活动事务所属的类创建一个冲突图。它包含一组垂直,水平和对角线边缘。垂直边连接一个类中的两个节点,并表示该类中的冲突。水平边缘连接两个类之间的两个节点,并表示不同类之间的写冲突。对角线边缘跨两个类别连接两个节点,表示两个类别之间的读写冲突。
分析冲突图,以确定是否可以并行运行同一类内或两个不同类之间的两个事务。
分布式乐观并发控制算法扩展了乐观并发控制算法。对于此扩展,将应用两个规则-
规则1-根据此规则,执行交易时,必须在所有站点上本地验证交易。如果在任何站点上发现事务无效,它将中止。本地验证可确保事务在执行它的站点上保持可序列化性。事务通过本地验证测试后,将对其进行全局验证。
规则2-根据此规则,交易通过本地验证测试后,应进行全局验证。全局验证可确保如果两个冲突的事务在一个以上的站点上一起运行,则它们应在它们一起运行的所有站点上以相同的相对顺序提交。验证之后,这可能需要一个事务在提交之前等待另一个冲突的事务。这项要求使算法不太乐观,因为一旦在站点上验证交易就可能无法提交交易。