精华内容
下载资源
问答
  • 数据库并发控制

    千次阅读 2012-12-28 19:51:42
    1. 在数据库中为什么要并发控制?  答:数据库是共享资源,通常有许多个事务同时在运行。  当多个事务并发地存取数据库时就会产生同时读取和/或修改同一数据的情况。若对并发操作不加控制就可能会存取和存储不...

    1. 在数据库中为什么要并发控制?

      答:数据库是共享资源,通常有许多个事务同时在运行。

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

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

      答:并发操作带来的数据不一致性包括三类:丢失修改、不可重复读和读“脏”数据。

      (1)丢失修改(Lost Update)

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

      (2)不可重复读(Non-Repeatable Read)

      不可重复读是指事务T1读取数据后,事务T2执行更新操作,使T1无法再现前一次读取结果。

      (3)读“脏”数据(Dirty Read)

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

      避免不一致性的方法和技术就是并发控制。最常用的并发控制技术是封锁技术。

    3. 基本的封锁类型有几种?试述它们的含义。

      答:基本的封锁类型有两种: 排它锁(Exclusive Locks,简称X锁) 和共享锁(Share Locks,简称S锁)。

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

      共享锁又称为读锁。若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这就保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。

      

    4.三级封锁协议的主要区别是什么? 

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

       二级封锁协议:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,读完后即可释放S锁。

       三级封锁协议:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。

      三级协议的主要区别在于什么操作需要申请封锁,何时申请封锁以及何时释放锁(即持锁时间的长短)。      

    5. 什么样的并发调度是正确的调度?

      答:可串行化(Serializable)的调度是正确的调度。

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

      

    6. 试述两段锁协议的概念。

      答:两段锁协议是指所有事务必须分两个阶段对数据项加锁和解锁。

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

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

    展开全文
  • 数据库中并发控制

    千次阅读 2017-03-11 17:54:02
    1、写在前面1.1 为什么要并发控制如果事务在并发执行时,来自各个并发事务的所有指令的执行控制都是由操作系统负责,那么许多调度都是可能的。这样,很可能会导致数据库处于不一致的状态。所以,必须保证数据库执行...

    1、写在前面

    1.1 为什么要并发控制

    如果事务在并发执行时,来自各个并发事务的所有指令的执行控制都是由操作系统负责,那么许多调度都是可能的。这样,很可能会导致数据库处于不一致的状态。所以,必须保证数据库执行的任何调度都能是数据库保持一致状态,这是数据库中并发控制(concurrency-control)模块的功能。
    具体地说,数据库的并发控制模块就是为用户提交的多个事务产生满足需求的调度。

    1.2 并发控制的相关内容

    1.2.1 内容列表

    为了理解这一过程,我们需要了解:
    - 并发中有关调度的相关基本概念
    - 串行化及其判定
    - 可恢复调度与无级联调度
    - 事务的隔离级别等相关信息。

    1.2.2 内容概要

    基本概念部分,略过不表。
    串行化及其判定部分大致介绍了如何判定事务在并发执行时是否和先后顺序执行时效果一致。明确了这部分,DBMS在为事务选择并发调度时,才知道最优解是什么(也就是,执行效果和先后执行相同)。
    可恢复调度和无级联调度部分是在从故障恢复的角度讲述,如果一个并行执行的调度中间发生故障,为了保证事务的原子性,必须进行回滚恢复,然而,有时恢复的代价很大,有时甚至无法恢复。这部分对这些情况分别介绍。
    事务的隔离级别部分讲述,在事务并发的过程中,如果要保证任何时刻绝对的数据正确,代价是很高的。比如,好多时候就无法实现并发,只能是串行执行。在一些联机的场景中,这是不能接受的。隔离级别就是为了兼顾效率的产物,通过允许不同程度地允许,并发过程中数据的暂时不一致,来换取更好的执行效率。

    2、几个基本概念

    • 调度(schedule)
      事务在并发执行时,各个事务中的不同指令的先后执行顺序称为调度。比如事务T1由两条指令a和b组成,事务T2由c和d组成。那么,这两个事务在并发执行时abcd、acbd等的这些执行顺序都称之为调度。
    • 串行的(serial)
      如果在一个调度中,属于同一个事务的指令紧挨在一起,我们就称这个调度是串行的。上面的例子中,T1和T2的串行调度有两种,分别是abcd和cdab。对于n个事务组成的事务组,共有n!个不同的串行调度。
    • 可串行化的(serializable)
      如果一个调度等价于一个串行调度,那么就称该调度是可串行化的。显然,串行调度是可串行化的。

    3、调度的可串行化

    3.1 串行化与冲突可串行化

    串行调度是可串行化的,但是,如果许多事务的指令交错执行,则很难确定一个调度是否是可串行化的。事务就是程序,要确定一个事务有哪些操作,多个事务的不同操作如何相互作用,是非常困难的。
    因此,这里我们不会考虑一个事务可以对一个数据项执行的所有不同类型的操作,而只考虑两种操作:read和write。我们假设,在数据Q上的read(Q)和write(Q)之间,事务可以对驻留在事务局部缓冲区中Q的拷贝执行任意操作序列。按这种模式,从调度的角度来说,事务唯一重要的操作就是read和write。
    假设I和J是不同事务在相同数据项上的操作,那么当它们全是read时,它们的次序无关紧要。但是,当其中至少有一个书write时,它们的顺序将直接影响最终事务的执行结果,这时我们说I和J是冲突(conflict)的。
    如果调度S经过一系列非冲突指令次序交换转换成S’,我们称S和S’是冲突等价(conflict equivalent)的。
    可以理解,不是所有的串行调度之间都是冲突等价的。
    如果一个调度与串行调度冲突等价,则称该调度是冲突可串行化(conflict serializable)的。

    3.2 冲突可串行化的判定

    这里给出一个简单有效的方法,来确定一个调度是否冲突可串行化。假设S是一个调度,我们由S构造一个有向图,称为优先图(precedence graph)。该图由定义为G=(V,E),其中V是顶点集,E是边集,顶点集由所有参与调度的事务组成。如果事务Ti和Tj满足下列三个条件之一,优先图中就存在边Ti->Tj:

    • 在Tj执行read(Q)之前,Ti执行write(Q)。
    • 在Tj执行write(Q)之前,Ti执行read(Q)。
    • 在Tj执行write(Q)之前,Ti执行write(Q)。

    这里的意思是,事务中冲突的操作决定了事务的执行顺序。所以,如果优先图中存在边Ti->Tj,则在任何等价于S的串行调度S’中,Ti必出现在Tj之前。
    这样,如果调度S的优先图中有环,则调度S是非冲突可串行化的,如果优先图中无环,则调度S是冲突可串行化的。
    串行化顺序(serializability order)可通过拓扑排序(topological sorting,用于计算与优先图的偏序相一致的线形顺序)得到。一般而言,通过拓扑排序可以获得多个线形顺序。
    因此,要判断冲突可串行化,需要构造优先图并调用一个环检测算法。基于深度优先的环检测算法需要n^2数量级的运算,其中n是优先图中的定点数(即事务数)。

    3.3 冲突等价的局限性

    有可能存在两个调度,它们产生的结果相同,但它们不是冲突等价的。比如下面的例子:
    调度S

    利用前面提到的优先图判定方法,上图的调度S并不与串行调度

    4、事务的隔离性和原子性

    不管是什么原因,如果事务Ti失败了,我们必须撤销该事务的影响以确保其原子性。在允许并发执行的系统中,原子性要求依赖于Ti的任何事务Tj(即Tj读取了Ti写的数据)也中止。为了确保这一点我们需要对系统所允许的调度类型做一些限制。

    4.1 可恢复调度

    如下所示的调度,事物T2只执行一条指令:read(A)。我们称之为部分调度(partial schedule)。因为T1中没有包括commit或abort操作。注意T2执行read(A)指令后立即提交。因此T2提交时T1仍处于活跃状态。现假定T1在提交前发生了故障。T2已经读取了T1写入的数据A的值(我们说T2依赖于T1)。因此,我们必须终止T2以保证事务的原子性。但T2已经提交,不能再中止。这样就出现了T1发生故障之后不能正确恢复的情形。

    不可恢复调度示例

    上面例子中的调度是一个不可恢复调度的例子。一个可恢复调度(recoverable schedule)应满足:对于每对事务Ti和Tj,如果Tj读取了之前由Ti所写的数据项,则Ti应该先于Tj提交。上面的例子如果是可恢复的,那么T2应该推迟至T1提交之后再提交。

    4.2 无级联调度

    即使一个调度是可恢复的,要从事务Ti的故障中正确恢复,可能需要回滚若干事务。当其它事务读取了Ti写入的数据项时就会发生这种情况。下面调度中,如果T1发生故障,回滚。由于T2读取了T1写入的数据A,T2必须回滚。同理,T3也必须回滚。这种因单个事务故障导致一系列事务回滚的现象称为级联回滚(cascading rollback)。

    级联回滚示例

    级联回滚导致大量的撤销工作,这是我们不希望的。所以要对调度进行限制,避免级联回滚发生,这样的调度称为无级联调度。规范地说,无级联调度(cascadeless schedule)必须满足:对于事务Ti和Tj,如果Tj读取了先前由Ti所写的数据项,则Ti必须在Tj这一读操作之前提交。
    容易理解,一个无级联调度也是可恢复调度。

    5、事务的隔离级别

    5.1 隔离级别定义和解释

    • 读未提交(read uncommitted)
      这是最低的隔离级别。意思是,事务在并发时,允许一个事务读取另一个事务已经修改但还未提交的数据。这种情况下,会导致脏读。脏读针对的是更新操作。比如,事务T1更新了数据库中记录A的值,没有提交,T2读取了记录A,然后,T1回滚。这样,T2读取到的就是一个错误的数据。这种现象就叫脏读。
    • 读提交(read committed)
      事务在并发执行时,只允许读取其它事务已经提交的数据。
      这样,可以解决数据的脏读问题,但是并不能保证可重复读。比如,事务T1中有两次对记录A的读取操作,在这两次读取操作之间,事务T2修改了记录A的值并提交。这样,T1两次读取到的值就会不同,这种现象成为不可重复读。
    • 可重复读(repeatable read)
      事务在并发执行时,只允许读取已经提交的数据,而且一个事务在两次读取一个数据项期间,其他事务不得更新该数据。这样,就保证了数据的可重复读。但是,也存在幻读的问题。
      幻读,幻读针对的是插入操作。比如事务T1中选出数据库中符合条件的记录,然后,事务T2又向数据库中插入了一条数据,也符合T1的筛选条件,然后提交,这时,T1第二次查找符合条件的数据,就会发现结果集中多了一条记录。就好像出现了幻觉,所以称为幻读。
    • 可串行化(serializable)
      通常保证可串行化调度。但是,一些数据库对该隔离级别的实现,在某些情况下允许非串行化执行。

    5.2 上述事务隔离级别的说明

    从上到下,隔离级别依次提高。每个隔离级别的定义和解释中,说的都是该级别的最低要求。
    所有的隔离级别都不允许脏写(dirty write),即如果一个数据项已经被另外一个未提交或者终止的事务写入,则不允许其它事务对该数据项进行写操作。
    实现上,大多数数据库默认的事务隔离级别是Read committed,比如Sql Server , Oracle。Mysql的默认隔离级别是Repeatable read。
    SQL中,可以显示设定事务的隔离级别。如可以通过语句set transaction isolation level serializable;来显示将隔离级别设置为可串行化。另外,修改事务隔离级别必须作为事务的第一条语句执行。

    展开全文
  • 数据库并发控制知识点总结

    千次阅读 2016-08-28 13:13:40
    刚看到一篇很不错的数据库并发控制知识点总结,包括一部分可能会出现在笔试面试中的题目,适合对基础概念理解不透彻的我,就转载过来了。 ...   ...1. 在数据库中为什么要并发控制? 答:数据库是

    刚看到一篇很不错的数据库并发控制知识点总结,包括一部分可能会出现在笔试面试中的题目,适合对基础概念理解不透彻的我,就转载过来了。

     原文地址:http://blog.csdn.net/xiangminjing/article/details/5922325。

           

           

    数据库并发控制

     

     

     

    1.  在数据库中为什么要并发控制?

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

     

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

    答:并发操作带来的数据不一致性包括三类:丢失修改、不可重复读和读“脏’夕数据。 ( l )丢失修改(lost update ) 两个事务 Tl 和T2读入同一数据并修改,T2提交的结果破坏了(覆盖了) Tl 提交的结果,导致 Tl 的修改被丢失。 ( 2 )不可重复读( Non 一 Repeatable Read ) 不可重复读是指事务 Tl 读取数据后,事务几执行更新操作,使 Tl 无法再现前一次读取结果。( 3 )读“脏”数据( Dirty Read ) 读“脏’夕数据是指事务 Tl 修改某一数据,并将其写回磁盘,事务几读取同一数据后, Tl 由于某种原因被撤销,这时 Tl 已修改过的数据恢复原值,几读到的数据就与数据库中的数据不一致,则几读到的数据就为“脏”数据,即不正确的数据。避免不一致性的方法和技术就是并发控制。最常用的技术是封锁技术。也可以用其他技术,例如在分布式数据库系统中可以采用时间戳方法来进行并发控制。

     

    3 .什么是封锁?基本的封锁类型有几种?试述它们的含义。

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

    基本的封锁类型有两种:排它锁( Exclusive Locks ,简称 x 锁)和共享锁 ( Share Locks,简称 S 锁)。排它锁又称为写锁。若事务 T 对数据对象 A 加上 X 锁,则只允许 T 读取和修改 A ,其他任何事务都不能再对 A 加任何类型的锁,直到 T 释放 A 上的锁。这就保证了其他事务在 T 释放 A 上的锁之前不能再读取和修改 A 。共享锁又称为读锁。若事务 T 对数据对象 A 加上 S 锁,则事务 T 可以读 A但不能修改 A ,其他事务只能再对 A 加 S 锁,而不能加 X 锁,直到 T 释放 A 上的 S 锁。这就保证了其他事务可以读 A ,但在 T 释放 A 上的 S 锁之前不能对 A 做任何修改。

     

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

    答: DBMS 在对数据进行读、写操作之前首先对该数据执行封锁操作,例如下图中事务 Tl 在对 A 进行修改之前先对 A 执行 xock ( A ) ,即对 A 加 x 锁。这样,当几请求对 A 加 x 锁时就被拒绝,几只能等待 Tl 释放 A 上的锁后才能获得对 A 的 x 锁,这时它读到的 A 是 Tl 更新后的值,再按此新的 A 值进行运算。这样就不会丢失 Tl 的更新。

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

     

    5 .什么是活锁?什么是死锁?

    答:

    如果事务 Tl 封锁了数据 R ,事务几又请求封锁 R ,于是几等待。几也请求封锁 R ,当 Tl 释放了 R 上的封锁之后系统首先批准了几的请求,几仍然等待。然后几又请求封锁 R ,当几释放了 R 上的封锁之后系统又批准了几的请求 … … 几有可能永远等待,这就是活锁的情形。活锁的含义是该等待事务等待时间太长,似乎被锁住了,实际上可能被激活。如果事务 Tl 封锁了数据 Rl ,几封锁了数据凡,然后 Tl 又请求封锁几,因几已封锁了几,于是 Tl 等待几释放几上的锁。接着几又申请封锁 Rl ,因 Tl 已封锁了 Rl ,几也只能等待 Tl 释放 Rl 上的锁。这样就出现了 Tl 在等待几,而几又在等待 T }的局面, T }和几两个事务永远不能结束,形成死锁。

     

    6 .试述活锁的产生原因和解决方法。

    答:活锁产生的原因:当一系列封锁不能按照其先后顺序执行时,就可能导致一些事务无限期等待某个封锁,从而导致活锁。避免活锁的简单方法是采用先来先服务的策略。当多个事务请求封锁同一数据对象时,封锁子系统按请求封锁的先后次序对事务排队,数据对象上的锁一旦释放就批准申请队列中第一个事务获得锁。

     

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

    答:数据库系统一般采用允许死锁发生, DBMS 检测到死锁后加以解除的方法。 DBMS 中诊断死锁的方法与操作系统类似,一般使用超时法或事务等待图法。超时法是:如果一个事务的等待时间超过了规定的时限,就认为发生了死锁。超时法实现简单,但有可能误判死锁,事务因其他原因长时间等待超过时限时,系统会误认为发生了死锁。若时限设置得太长,又不能及时发现死锁发生。 DBMS 并发控制子系统检测到死锁后,就要设法解除。通常采用的方法是选择一个处理死锁代价最小的事务,将其撤消,释放此事务持有的所有锁,使其他事务得以继续运行下去。当然,对撤销的事务所执行的数据修改操作必须加以恢复。

     

     12 .什么样的并发调度是正确的调度?

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

     

    9 .设 Tl ,几,几是如下的 3 个事务:

    Tl :A : = A + 2 ;

    T2:A : = A * 2 ;

    T3:A : = A **2 ; ( A <-A*A)

    设 A 的初值为 0 。

    ( l )若这 3 个事务允许并行执行,则有多少可能的正确结果,请一一列举出来。

    答 :A 的最终结果可能有 2 、 4 、 8 、 16 。因为串行执行次序有 Tl T2T3、 Tl T3T2、T2T1T3、T2T3Tl 、T3T1T2、T3T2 Tl 。对应的执行结果是 16 、 8 · 4 · 2 · 4 · 2 。

    ( 2 )请给出一个可串行化的调度,并给出执行结果

    答:

     

    最后结果 A 为 16 ,是可串行化的调度。

    ( 3 )请给出一个非串行化的调度,并给出执行结果。

    答:

             

          最后结果 A 为 0 ,为非串行化的调度。

    ( 4 )若这 3 个事务都遵守两段锁协议,请给出一个不产生死锁的可串行化调度。

    答:

             

         ( 5 )若这 3 个事务都遵守两段锁协议,请给出一个产生死锁的调度。

    答:

             

     

    11.试证明,若并发事务遵守两段锁协议,则对这些事务的并发调度是可串行化的。

    证明:首先以两个并发事务 Tl 和T2为例,存在多个并发事务的情形可以类推。根据可串行化定义可知,事务不可串行化只可能发生在下列两种情况:

     ( l )事务 Tl 写某个数据对象 A ,T2读或写 A ;

    ( 2 )事务 Tl 读或写某个数据对象 A ,T2写 A 。

    下面称 A 为潜在冲突对象。

    设 Tl 和T2访问的潜在冲突的公共对象为{A1,A2 … , An }。不失一般性,假设这组潜在冲突对象中 X =(A 1 , A2 , … , Ai }均符合情况 1 。 Y ={A i + 1 , … , An }符合所情况( 2 )。

    VX ∈ x , Tl 需要 XlockX ①

    T2 需要 Slockx 或 Xlockx ②

     1 )如果操作 ① 先执行,则 Tl 获得锁,T2等待

    由于遵守两段锁协议, Tl 在成功获得 x 和 Y 中全部对象及非潜在冲突对象的锁后,才会释放锁。

    这时如果存在 w ∈ x 或 Y ,T2已获得 w 的锁,则出现死锁;否则, Tl 在对 x 、 Y 中对象全部处理完毕后,T2才能执行。这相当于按 Tl 、T2的顺序串行执行,根据可串行化定义, Tl 和几的调度是可串行化的。

    2 )操作 ② 先执行的情况与( l )对称因此,若并发事务遵守两段锁协议,在不发生死锁的情况下,对这些事务的并发调度一定是可串行化的。证毕。

     

    12 .举例说明,对并发事务的一个调度是可串行化的,而这些并发事务不一定遵守两段锁协议。

    答:

     

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

    答:引进意向锁是为了提高封锁子系统的效率。该封锁子系统支持多种封锁粒度。原因是:在多粒度封锁方法中一个数据对象可能以两种方式加锁 ― 显式封锁和隐式封锁。因此系统在对某一数据对象加锁时不仅要检查该数据对象上有无(显式和隐式)封锁与之冲突,还要检查其所有上级结点和所有下级结点,看申请的封锁是否与这些结点上的(显式和隐式)封锁冲突,显然,这样的检查方法效率很低。为此引进了意向锁。意向锁的含义是:对任一结点加锁时,必须先对它的上层结点加意向锁。例如事务 T 要对某个元组加 X 锁,则首先要对关系和数据库加 ix 锁。换言之,对关系和数据库加 ix 锁,表示它的后裔结点 ― 某个元组拟(意向)加 X 锁。引进意向锁后,系统对某一数据对象加锁时不必逐个检查与下一级结点的封锁冲突了。例如,事务 T 要对关系 R 加 X 锁时,系统只要检查根结点数据库和 R 本身是否已加了不相容的锁(如发现已经加了 ix ,则与 X 冲突),而不再需要搜索和检查 R 中的每一个元组是否加了 X 锁或 S 锁。

     

    14 .试述常用的意向锁: IS 锁、 ix 锁、 SIX 锁,给出这些锁的相容矩阵。

    答: IS锁:如果对一个数据对象加 IS 锁,表示它的后裔结点拟(意向)加 S 锁。例如,要对某个元组加 S 锁,则要首先对关系和数据库加 IS 锁

    IX 锁:如果对一个数据对象加 ix 锁,表示它的后裔结点拟(意向功口 X 锁。例如,要对某个元组加 X 锁,则要首先对关系和数据库加 ix 锁。

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

    相容矩阵:

     

    15 .理解并解释下列术语的含义:封锁、活锁、死锁、排它锁、共享锁、并发事务的调度、可串行化的调度、两段锁协议。

    答:(略,已经在上面有关习题中解答)

     

    16 .试述你了解的某一个实际的 DBMS 产品的并发控制机制。

    答:(略,参见简单介绍了有关 Oracle 的并发控制机制)

     

    展开全文
  • 1. 在数据库中为什么要并发控制?  答:数据库是共享资源,通常有许多个事务同时在运行。  当多个事务并发地存取数据库时就会产生同时读取和/或修改同一数据的情况。若对并发操作不加控制就可能会存取和存储...

    1. 在数据库中为什么要并发控制?

      答:数据库是共享资源,通常有许多个事务同时在运行。

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

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

      答:并发操作带来的数据不一致性包括三类:丢失修改、不可重复读和读 “脏”数据。

      ( 1)丢失修改(Lost Update)

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

      ( 2)不可重复读(Non-RepeatableRead)

      不可重复读是指事务 T1读取数据后,事务T2执行更新操作,使T1无法再现前一次读取结果。

      ( 3)读“脏”数据(DirtyRead)

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

      避免不一致性的方法和技术就是并发控制。最常用的并发控制技术是封锁技术

      也可以用其他技术,例如在分布式数据库系统中可以采用时间戳方法来进行并发控制。

    3. 什么是封锁?

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

      封锁是实现并发控制的一个非常重要的技术。

    3. 基本的封锁类型有几种?试述它们的含义。

      答:基本的封锁类型有两种 :排它锁(Exclusive Locks,简称X锁) 和共享锁(ShareLocks,简称S锁)

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

      共享锁又称为读锁。若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这就保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。

    5.什么是封锁协议?不同级别的封锁协议的主要区别是什么?

      答:在运用封锁技术对数据加锁时,要约定一些规则。例如,在运用X锁和S锁对数据对象加锁时,要约定何时申请X锁或S锁、何时释放封锁等。这些约定或者规则称为封锁协议(LockingProtocol)。对封锁方式约定不同的规则,就形成了各种不同的封锁协议。不同级别的封锁协议,例如《概论》中介绍的三级封锁协议,三级协议的主要区别在于什么操作需要申请封锁,何时申请封锁以及何时释放锁(即持锁时间的长短)。

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

       二级封锁协议:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,读完后即可释放S锁。

       三级封锁协议:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放

    6. 不同封锁协议与系统一致性级别的关系是什么?

      答:不同的封锁协议对应不同的一致性级别。

      一级封锁协议可防止丢失修改,并保证事务T是可恢复的。在一级封锁协议中,对读数据是不加S锁的,所以它不能保证可重复读和不读“脏”数据。

       二级封锁协议除防止了丢失修改,还可进一步防止读“脏”数据。在二级封锁协议中,由于读完数据后立即释放S锁,所以它不能保证可重复读。

       在三级封锁协议中,无论是读数据还是写数据都加长锁,即都要到事务结束时才释放封锁。所以三级封锁协议除防止了丢失修改和不读“脏”数据外,还进一步防止了不可重复读。

    7. 试述活锁的产生原因和解决方法。

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

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

    8. 请给出预防死锁的若干方法。

      答:在数据库中,产生死锁的原因是两个或多个事务都已封锁了一些数据对象,然后又都请求已被其他事务封锁的数据加锁,从而出现死等待。

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

      ( 1)一次封锁法

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

      ( 2)顺序封锁法

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

      不过,预防死锁的策略不大适合数据库系统的特点。

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

      答:数据库系统一般采用允许死锁发生, DBMS检测到死锁后加以解除的方法

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

      超时法是:如果一个事务的等待时间超过了规定的时限,就认为发生了死锁。超时法实现简单,但有可能误判死锁,事务因其他原因长时间等待超过时限时,系统会误认为发生了死锁。若时限设置得太长,又不能及时发现死锁发生。

    DBMS并发控制子系统检测到死锁后,就要设法解除。通常采用的方法是选择一个处理死锁代价最小的事务,将其撤消,释放此事务持有的所有锁,使其他事务得以继续运行下去。当然,对撤销的事务所执行的数据修改操作必须加以恢复。

    10. 什么样的并发调度是正确的调度?

      答:可串行化( Serializable)的调度是正确的调度。

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

    11. 试述两段锁协议的概念。

      答:两段锁协议是指所有事务必须分两个阶段对数据项加锁和解锁。

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

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

    “两段”的含义是,事务分为两个阶段:

      第一阶段是获得封锁,也称为扩展阶段。在这阶段,事务可以申请获得任何数据项上的任何类型的锁,但是不能释放任何锁。

      第二阶段是释放封锁,也称为收缩阶段。在这阶段,事务释放已经获得的锁,但是不能再申请任何锁。

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

      答:引进意向锁是为了提高封锁子系统的效率。该封锁子系统支持多种封锁粒度

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

      意向锁的含义是:对任一结点加锁时,必须先对它的上层结点加意向锁。

       例如事务T要对某个元组加X锁,则首先要对关系和数据库加IX锁。换言之,对关系和数据库加IX锁,表示它的后裔结点—某个元组拟(意向)加X锁。

      引进意向锁后,系统对某一数据对象加锁时不必逐个检查与下一级结点的封锁冲突了。例如,事务T要对关系R加X锁时,系统只要检查根结点数据库和R本身是否已加了不相容的锁(如发现已经加了IX,则与X冲突),而不再需要搜索和检查R中的每一个元组是否加了X锁或S锁。

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

      答: IS锁

      如果对一个数据对象加 IS锁,表示它的后裔结点拟(意向)加S锁。例如,要对某个元组加S锁,则要首先对关系和数据库加IS锁

    IX锁

      如果对一个数据对象加 IX锁,表示它的后裔结点拟(意向)加X锁。例如,要对某个元组加X锁,则要首先对关系和数据库加IX锁。

    SIX锁

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

      相容矩阵(略)


    展开全文
  • 数据库中为什么要并发控制 ?并发控制技术能保证事务的哪些特性?2. 并发操作可能会产生哪几类数据不一致?用什么方法可以避免各种不一致的情况?3. 什么是封锁?基本的封锁类型有几种?试述它们的含义。4. 如何...
  • 数据库并发学习总结

    千次阅读 2016-03-30 13:00:34
    1. 在数据库中为什么要并发控制? 答:数据库是共享资源,通常有许多个事务同时在运行。当多个事务并发地存取数据库时就会产生同时读取和/或修改同一数据的情况。若对并发操作不加控制就可能会存取和存储不...
  • Oracle数据库-并发控制

    千次阅读 2017-10-17 13:17:08
    为什么要进行并发控制 三种典型的由并发事务引起的数据不一致现象: 1.丢失修改:  以购票为例,一次购票过程,剩余票数这个字段需要被读取,更新(x=x-1),写入。两个人A、B同时购票,B在A写入新的票数之前...
  • 并发控制习题

    2020-06-22 18:42:49
    1.在数据库中为什么要并发控制?并发控制可以保证事务的哪些特性? 数据库的一个明显的特点就是多个用户共享数据库资源,尤其是多用户可以同时存取相同的数据。在这样的系统中,在同一时刻并发运行的事务数可达数百...
  • 1.事务(Transaction)是并发控制的基本单位。 所谓的事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。例如,银行转账工作:从一个账号扣款并使另一个账号增款,这两个...
  • 3.在数据库中为什么要并发控制? 答:为避免多个事务之间的相互干扰。 4.并发控制的措施是什么? 答:加锁。 5.设有三个事务:T1、T2和T3,其所包含的动作为: T1:A = A + 2;T2:A = A * 2;T3:A = A - 1 .....
  • 当然在我们的数据库中也有锁用来控制资源的并发访问,这也是数据库和文件系统的区别之一。 1.2为什么要懂数据库锁? 通常来说对于一般的开发人员,在使用数据库的时候一般懂点DQL(select),DML(insert,update,delete)...
  • 第 11 章 并发控制 第 11 章 并发控制 1 在数据库中为什么要并发控制 答数据库是共享资源通常有许多个事务同时在运行当多个事务并发地存取数据库时就会产生同时读取 和或修改同一数据的情况若对并发操作不加控制就...
  • 1.锁?...当然在我们的数据库中也有锁用来控制资源的并发访问,这也是数据库和文件系统的区别之一。 1.2为什么要懂数据库锁? 通常来说对于一般的开发人员,在使用数据库的时候一般懂点DQL(select)...
  • 原文链接 ...当然在我们的数据库中也有锁用来控制资源的并发访问,这也是数据库和文件系统的区别之一。 1.2为什么要懂数据库锁? 通常来说对于一般的开发人员,在使用数据库的时候一般懂点DQL(s...

空空如也

空空如也

1 2 3 4 5 ... 18
收藏数 349
精华内容 139
关键字:

数据库中为什么要并发控制