📅  最后修改于: 2021-01-11 06:22:12             🧑  作者: Mango
在可以同时执行多个事务的多程序环境中,控制事务的并发性非常重要。我们有并发控制协议,以确保并发事务的原子性,隔离性和可序列化性。并发控制协议可以大致分为两类-
配备有基于锁的协议的数据库系统使用一种机制,通过该机制,任何事务都必须在获得适当的锁之前才能读取或写入数据。锁有两种-
二进制锁-数据项上的锁可以处于两种状态;它是锁定的还是未锁定的。
共享/独占-这种类型的锁定机制根据锁的用途来区分锁。如果获取了数据项上的锁以执行写操作,则它是排他锁。如果在同一个数据项上写入多个事务,则会导致数据库进入不一致状态。由于没有更改数据值,因此共享读取锁。
有四种类型的锁定协议可用-
基于简单锁的协议允许事务在执行“写”操作之前获得对每个对象的锁。事务可以在完成“写”操作后解锁数据项。
声明前的协议评估其操作并创建需要锁定的数据项列表。在开始执行之前,事务将事先向系统请求其所需的所有锁。如果授予了所有锁,则事务将在其所有操作结束后执行并释放所有锁。如果未授予所有锁,则事务将回滚并等待直到授予所有锁。
该锁定协议将事务的执行阶段分为三个部分。在第一部分中,当事务开始执行时,它会为其所需的锁寻求许可。第二部分是事务获取所有锁的位置。一旦事务释放第一锁,第三阶段便开始。在此阶段,事务不能要求任何新的锁;它仅释放获得的锁。
两阶段锁定有两个阶段,一个阶段是增长阶段,在该阶段,事务将获取所有锁定;第二阶段是增长阶段。第二阶段正在缩小,该事务所持有的锁正在释放。
要声明排他(写)锁,事务必须首先获取共享(读)锁,然后将其升级为排他锁。
Strict-2PL的第一阶段与2PL相同。在第一阶段获取所有锁之后,事务将继续正常执行。但是与2PL相比,Strict-2PL在使用后不释放锁。 Strict-2PL保留所有锁直到提交点,然后一次释放所有锁。
Strict-2PL不像2PL那样具有级联中止。
最常用的并发协议是基于时间戳的协议。该协议使用系统时间或逻辑计数器作为时间戳。
基于锁的协议在执行时管理事务之间冲突对之间的顺序,而基于时间戳的协议则在创建事务后立即开始工作。
每个交易都有一个与之关联的时间戳,其顺序由交易的时间确定。在0002时钟时间创建的事务要早于其后的所有其他事务。例如,任何在0004进入系统的事务“ y”都要年轻两秒,并且优先级将优先于老事务。
此外,每个数据项都具有最新的读写时间戳。这使系统知道何时对数据项执行了最后的“读取和写入”操作。
时间戳排序协议可确保事务在其冲突的读写操作中的可序列化性。协议系统的责任是应根据事务的时间戳值执行冲突的任务对。
时间戳顺序协议的工作方式如下-
如果事务Ti发出read(X)操作-
如果事务Ti发出write(X)操作-
该规则说明如果TS(Ti)
可以修改时间戳排序规则,以使时间表视图可序列化。
而不是让T i回滚,而是忽略了“写”操作本身。