解读数据库封锁协议

准备软考时,有个知识点,数据库封锁协议,比较难懂,这里做个笔记梳理下

解读数据库封锁协议_第1张图片

数据库都会有一个参数叫最大连接数。上述查询结果是:数据库服务器在理想状态时,是可以承受1000个并发用户来访问的。并发访问就会存在以下问题:

解读数据库封锁协议_第2张图片

一个数据库里面,对同一个数据进行并发修改操作,造成丢失更新;对同一个数据进行并发有读有写操作,造成不可重复读和读"脏"数据这是不可以接受的。为了解决这个问题,前辈们搞了一个数据库封锁协议。

数据库封锁协议前,先了解读锁和写锁,给写操作弄了一把写锁,叫排它锁,也叫X锁。如果给某个数据加了写锁,其它写锁或读锁就没办法给这个数据加上去了。给读操作弄了一把读锁,叫共享锁,也叫S锁,给一个数据加了读锁,那么其它事务或操作也可以给这个数据加读锁,但是加不了写锁了。

一级封锁协议
一级封锁协议是指,事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。一级封锁协议可以防止丢失修改,并保证事务T是可恢复的。

解析:

根据一级封锁协议,假设两个并发都是来写的,第一个并发正常加写锁,然后对该数据进行读写操作,并且还没有完成。此时,另外一个并发也来写,在写之前给这个数据进行加写锁,发现这个数据上面有一把锁,此时这个并发只能在那等待,等待到第一个并发读写操作完毕。此时:两个或两个以上的写,串行着来,所以能够解决丢失更新的问题。

根据一级封锁协议,只规定了并发写的操作,并没有规定读操作。如果并发中,有读操作,可以来读加了写锁的数据上,也可以读没有加锁的数据上,此协议下,依然存在不可重复读和读"脏"数据的问题。

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

解析:

我们知道,一级封锁协议解决了并发是写操作的情况,但是没有规定并发中有读操作的行为。所以制定了二级封锁协议。

二级封锁协议是在一级封锁协议基础上,规定了并发是读操作的行为。就是规定并发中是读操作的,那么在读操作之前需要加一个读锁。如果此时这个数据,被一个并发写操作加了一把写锁,根据写锁的特点(排它性),这个数据是无法再加一个写锁或读锁,所以呢就规定了这个并发中的读操作只能等写操作结束后才能去读。这样子这个并发读操作,拿到的是没有写操作时的数据,根据定义,这个数据就不算是"脏"数据。但是呢,根据二级封锁协议,读完就释放读锁,对于这个并发读,有可能还需要去读其它的表,可能有需求再回来再确定刚才读的数据有没有问题后,最终返回给用户结果。在去操作其它表的时候,有可能有并发写操作对这个数据进行修改,然后写操作之后,那个读回来了,发现刚才那个值变了。

所以这个二级封锁协议解决了读"脏"数据的问题,却没有解决数据可重复读的问题。

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

解析:

三级封锁协议解决了二级封锁协议中并发读操作不能进行数据不可重复读的问题。协议中的事务T,说的是办一件事。这件事情有可能会访问好几张数据库表(表A,表B,表C),最终返回结果给请求方,这算一个完成的事务。所以呢,三级封锁协议的释放这个读锁的时间放到了,最终返回结果给请求方的时候。解决了数据不可重复读的问题。

你可能感兴趣的:(分析层面)