数据库之并发控制

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lxw983520/article/details/82947804

并发控制

数据库是一个共享资源,允许多个用户同时使用同一个数据库的数据库系统称为多用户数据库系统,这样的系统在同一时刻并发运行的事务数可达到数百上千个。
并发控制的主要技术有封锁(locking)、时间戳(timestamp)、乐观控制法(optimistic scheduler)和多版本并发控制(MVCC)等。

事务可以一个一个地串行执行,即每个时刻只有一个事务进行,其他事务必须等待这个事务结束以后才能运行。事务在执行过程中需要不同的资源,可能是CPU,可能需要存取数据库,有时需要I/O或者通信。事务串行会导致许多系统资源处于空闲状态,因此,应该允许多个事务并行执行,发挥数据库共享资源的特点。
事务执行方式
在单处理机系统中,事务的并行执行实际上是这些并行事务的并行操作轮流交叉运行。这种并行执行方式称为交叉并发方式。虽然单处理机系统中的并行事务并没有真正地并行运行,但是减少了处理机的空闲时间,提高了系统的效率。
在多处理机系统中,每个处理机可以运行一个事务,多个处理机可以同时运行多个事务,实现多个事务真正的并行运行,这种并行执行方式称为同时并发方式。

并发控制机制是衡量一个数据库管理系统性能的重要标志之一。

一、并发控制概述

事务是并发控制的基本单位,保证事务的ACUD特性是事务处理的重要任务,而事务的ACID特性可能遭到破坏的原因之一是多个事务对数据库的并发操作造成的。为了保证事务的隔离性和一致性,数据库管理系统需要对并发操作进行正确的调度。
并发操作带来的数据不一致包括丢失修改、不可重复读和读“脏”数据。

1、丢失修改(lost update)

两个事务T和Y读入同一数据并修改,Y提交的结果破坏了T提交的结果,导致T的修改被丢失。

2、不可重复读(non-repeateble read)

不可重复读是指事务T读取数据后,事务Y执行更新操作,使T无法再现前一次的读取结果。不可重复读包括:

  1. 事务T读取某一数据后,事务Y对其进行了修改,当食物T再次读该数据时,得到与前一次不同的值。
  2. 事务T按一定条件从数据库中读取了某些数据记录后,事务Y删除了其中部分记录,当T再次按相同条件从数据库中读取某些数据记录后,事务Y插入了一些记录,当T再次按相同条件读取数据时,发现某些记录神秘地消失了。
  3. 事务T按一定条件从数据库中读取某些数据记录后,事务Y插入一些记录,当T再次按相同条件读取数据时,发现多了一些记录。
    **备注:**第2、3条也称为幻影现象。
3、读“脏”数据(dirty read)

事务T修改某一数据并将其写会磁盘,事务Y读取同一数据后,T由于某种原因被撤销,这是被T修改过的数据恢复原值,Y读到的数据就与数据库中的数据不一致,则Y读到的数据就为“脏”数据,则不正确的数据。
数据不一致示例:
数据不一致原因
产生数据不一致的主要原因:
1、并发操作破坏了事务的隔离性。并发控制机制就是要用正确的方式调度并发操作,使一个用户事务的执行不受其他事务的干扰,从而避免造成数据的不一致。
2、对数据库的应用有时允许某些不一致性。

二、封锁

封锁是实现并发的一个非常重要的技术。所谓封锁就是事务T在对某个数据对象(如表、记录等)操作之前,先向系统发出请求,对其加锁。加锁后事务T就对该数据对象有 一定的控制,在事务T释放它的锁之前,其他事务不能更新此数据对象。
确切的控制由封锁的类型决定,基本的封锁类型有:排他锁(X锁)和共享锁(S锁)。

1、排他锁

排他锁又称为写锁。若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A上的锁为止。这就保证了其他事务在T释放A上的锁不能再读取和修改A。

2、共享锁

共享锁又称读锁。若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A锁加S锁,而不能加X锁,直到T释放A上的S锁为止。这就保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
排他锁和共享锁的控制方式如下:
封锁类型的相容矩阵
说明:第一列表示事务T1已经获得的数据对象上的锁的类型,- 表示没有枷锁。第一行表示另一个事务T2对统一数据对象发出的封锁请求。T2的封锁请求能否被满足用矩阵中的Y和N表示,其中Y表示事务T2的封锁要求与T1已持有的锁相容,封锁请求可以满足。N表示T2的封锁请求与T1已持有的锁冲突,T2的请求被拒绝。

三、封锁协议

封锁协议:在运用X锁和S锁这两种基本封锁对数据对象加锁时,还需要约定一些规则(何时申请X锁和S锁、持锁时间、何时释放等)。

三级封锁协议
1、一级封锁协议

该协议是指事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。事务结束包括正常结束(COMMIT)和非证结束(ROLLBACK)。
一级封锁协议可以防止丢失修改,并保证事务T是可恢复的。在该协议中,如果仅仅是读数据而不对其进行修改,是不需要加锁的,所以它不能保证可重复读和不读“脏”数据。

2、二级封锁协议

该协议是指在以及封锁协议基础上增加事务T在读取数据R之前必须先对其加S锁,读完后即可释放S锁。
二级封锁协议除防止了丢失修改,还可进一步防止读“脏”数据。在该协议中,由于读完数据后即可释放S锁,所以它不能保证可重复读。

3、三级封锁协议

该协议是指在一级封锁协议的基础上增加事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。
三级封锁协议除了防止丢失修改和读“脏”数据外,还进一步防止了不可重复读。
使用封锁机制解决三种数据不一致性图示:
三种封锁协议的区别
三级协议主要区别在于什么操作需要申请封锁,以及何时释放锁(即持锁时间)。
不同级别的封锁协议和一致性保证总结:
三种协议总结
不同的封锁协议使事务达到的一致性级别是不同的,封锁协议级别越高,一致性程度越高。

猜你喜欢

转载自blog.csdn.net/lxw983520/article/details/82947804