考研复试数据库原理课后习题(十一)——并发控制

  • Post author:
  • Post category:其他




并发控制



1.数据库中为什么要并发控制?并发控制能保证事务的哪些特性?

数据库是共享资源,通常有多个事务同时在运行。当多个事务并发地存取数据库时就会产生读取和/或修改同一数据的情况。若对并发操作不加控制就可能会存取和存储不正确的数据,破坏数据库的一致性。所以数据库管理系统必须提供并发控制机制。

并发一致性可以保证事务的一致性和隔离性。



2.并发操作可能会产生哪几类数据不一致性?用什么方法能避免各种不一致的情况?


丢失修改


两个事务T1和T2读入同一数据并修改,t2提交的结果破坏了(覆盖了)T1提交的结果,导致T1的修改被丢失。


不可重复读


不可重复读是指事务T1读取某一数据后,事务T2对其执行更新操作,使T1无法再现前一次的读取结果,不可重复读包括三种情况:

  • 事务T1读取某一数据后,事务T2对其做了修改,当事务T1再次读取数据时,得到与前一次不同的值。
  • 事务T1按一定条件从数据库中读取了某些数据记录后,事务T2删除了其中部分记录,当T1再次按照相同条件读取数据时,发现某些记录消失了。

    事务T1按一定条件从数据库中读取了某些数据记录后,事务T2插入了一些记录,当T1再次按照相同条件读取数据时,发现多了一些记录。

    后两种有时称为幻影读现象。


读脏数据


读脏数据是事务T1修改某一数据,将其写回磁盘,事务T2读取同一数据后,T1由于某种原因被撤销,这时T1已修改的数据恢复原值,T2读到数据就与数据库中的数据不一致,则T2读到的数据就称为脏数据,即不正确的数据。

避免不一致性的 方法就是并发控制,常用的并发控制技术包括封锁方法,时间戳方法、乐观控制方法和多版本并发控制方法。



3.什么是封锁?基本的封锁类型有几种?

封锁就是事务T对某个数据对象,例如表、记录等操作之前,先向系统发出请求,对其加锁。加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的索之前,其他事务不能更新或读取此数据对象。

基本的封锁类型:排他锁(X锁)、共享锁(S锁)

  • 排他锁又称为写锁,若事务T对数据对象A加上X锁,则只允许读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放了A上的锁。这就保证了其他事务在T释放A上的锁之前不能再读取和修改A。
  • 共享锁又称为读锁。若事务T对数据对象A加上S锁,则事务T可以读A但不能发生修改A,其他事务只能对A加S锁,而不能加X锁,直到T释放A上的S锁。这就保证其他事务可以读A,但在T释放A上加的S’锁之前不能对做任何修改。



4.如何使用封锁机制保证数据的一致性?

DBMS在对数据进行读写操作之前首先对该数据库执行封锁操作,例如图中事务T1在对A进行修改之前先对A执行Xock(A)即对A机上X锁。这样T2请求对A加X锁时就被拒绝,T2只能等待T1

释放A上的锁后才能获得对A的X锁,这时它读到的A是T1更新后的值,再按此新的A值进行运算。。这样就不会丢失T1的更新。

在这里插入图片描述

DBMS按照一定的封锁协议对并发操作进行控制,使得多个并发操作有序 的执行,就可以避免丢失修改、不可重复读和读”脏“数据不一致性。



5.什么是活锁?试述活锁产生的原因和解决办法

如果事务T1封锁了数据R,事务T2又请求封锁R,于是T2等待,T3也请求封锁R,当T1释放R上的封锁之后系统首先批准T3的请求,T2仍然等待。然后T4又请求封锁R,当T3释放R上的封锁系统批准T4的请求。。。T2有可能永远等待,如下图所示,这就是活锁的情形。活锁的含义是该等待事务等待时间太长,似乎被封锁住了,实际上可能被激活。

在这里插入图片描述

活锁产生的原因:当一系列的封锁不能按照先后顺序执行时,就可能导致一些事务无限期等待某哦个封锁,从而导致活锁。

避免获得活锁的简单方法时采用先来先服务的策略。当多个事务请求封锁同一数据对象时,封锁子系统按请求封锁的先后次序对事务排队,数据对象上的锁一旦释放就批准申请队列中第一个事务获得锁。



6.什么是死锁?给出解决预防死锁的方法

如果事务T1封锁了数据R1,T2封锁了数据R2,然后T1又请求封锁R2,因T2已经封锁了R2,于是T1等待T2释放R2上的锁。接着T2又申请封锁R1,因T1已封锁了R1,T2也只能等待T1释放R1上的锁。如下图,这样就出现了T1在等待T2,而T2又在等待T1的局面,T1、T2两个事务永远不能结束,形成死锁。

在这里插入图片描述

防止死锁的发生其实就是要破坏产生死锁的条件,预防死锁通常有两种方法:

  • 一次封锁法

    要求 每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行。
  • 顺序封锁法

    预先对数据对象规定一个封锁顺序,所有的事务都按照这个顺序实行封锁。



7.请给出检测死锁发生一种方法,当发生死锁后如何解除死锁?

数据库系统一般采用的方法 是允许死锁发生,DBMS检测死锁发生后解除。

DBMS中诊断死锁的方式与操作系统类似,一般使用超时法或事务等待图法。

超时法是指如果一个事务的等待时间超过了规定的实现,一般就认为发生了死锁。

DBMS并发控制子系统检测到死锁后,就要设法解除。通常采用的方法是选择一个处理死锁代价最小的事务,将其撤销,释放此事务持有的所有锁,使其他事务得以继续运行下去。



8.什么样的并发调度使正确的调度

可串行化的调度是正确的调度

可串行化的调度的定义:多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行它们时的结果相同,称这种调度策略为可串行化的调度。



9.为什么要引进意向锁?意向锁的含义是什么?

引进意向锁是为了提高封锁子系统的效率。

原因是:在多粒封锁方法中,一个数据对象可能以两种方式加锁——显示封锁、隐式封锁。因此系统在对某一数据对象加锁时,不仅要检查该数据对象上有无(显式和隐式)封锁与之冲突,还要检查其所有上级结点和下级结点,看申请的封锁是否与这些结点上的(显式和隐式)封锁冲突。显然,这样的检查方法效率很低。为此引进了意向锁。

意向锁的含义是:对任一结点加锁时,必须先对它的上层结点加意向锁。引进意向锁后,系统对某一数据对象加锁时 不必逐个检查与下一级结点的封锁冲突了。



10.试述常用的意向锁:IS锁、IX锁、SIX锁,给出相容矩阵。


IS锁

:如果对一个数据对象加IS锁,表示它的后裔结点拟(意向)加S锁。


IX锁

:如果对一个数据对象加IX锁,表示它的后裔结点拟(意向)加X锁。


SIX锁

:如果对一个数据对象加SIX锁,表示对它加S锁,再加IX锁,即SIX=S+IX。

相容矩阵:

在这里插入图片描述



版权声明:本文为weixin_43413095原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。