封锁协议与两段锁协议

封锁是实现并发控制的一个非常重要的技术。所谓封锁就是事务T在对某个数据对象例如表、记录等操作之前,先向系统发出请求,对其加锁。加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其他事务不能更新此数据对象。

确切的控制由封锁的类型决定。基本的封锁类型有两种:排他锁(exclusive locks,简称X锁)和共享锁(share locks,简称S锁)。

排他锁又称为写锁。

共享锁又称为读锁。

排他锁和共享锁的控制方式可以用相容矩阵来表示。

T1           T2

X

S

 

X

N

N

Y

S

N

Y

Y

 

Y

Y

Y

一级封锁协议:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。可防止丢失修改。

二级封锁协议:在一级封锁协议基础上增加事务T在读取数据R之前必须先对其加S锁,读完后即可释放S锁。除防止丢失修改,还可进一步防止读“脏”数据。

三级封锁协议:在一级封锁协议基础上增加事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。除防止丢失修改和读“脏”数据外,还进一步防止了不可重复读。

 

 

两段锁协议(TwoPhase Locking,简称2PL)

① 在对任何数据进行读、写操作之前,首先要申请并获得对该数据的封锁。

② 在释放一个封锁之后,事务不再申请和获得其它任何封锁。

即事务的执行分为两个阶段:

第一阶段是获得封锁的阶段,称为扩展阶段。

第二阶段是释放封锁的阶段,称为收缩阶段。

可以证明,若并发执行的所有事务均遵守两段锁协议,则对这些事务的任何并发调度策略都是可串行化的。

另外要注意两段锁协议和防止死锁的一次封锁法的异同之处。一次封锁法要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行,因此一次封锁法遵守两段锁协议;但是两段锁协议并不要求事务必须一次将所有要使用的数据全部加锁,因此遵守两段锁协议的事务可能发生死锁。

事务T1

事务T2

给A加读锁

读出A为260

 

 

给A加写锁

修改A为160

 

 

 

给B加读锁

读出B为1000

给B加写锁

修改B为1100

释放A的锁

 

 

释放B的锁

 

 

给C加读锁

读出C为300

 

 

给C加写锁

修改C为250

给A加读锁

等待

等待

等待

等待

等待

读出A为160

给A加写锁

 

修改A为210

释放C的锁

遵守两段锁协议的可串行化调度

 

摘自《数据库系统概论》(第5版)王珊 萨师煊编著

 

你可能感兴趣的:(计算机操作系统)