数据库并发控制的基础知识
当前位置:以往代写 > 数据库教程 >数据库并发控制的基础知识
2019-06-14

数据库并发控制的基础知识

数据库并发控制的基础知识

  计算机的主要应用之一就是数据处理,作为核心技术的数据库是共享资源,允许多个用户同时使用实现并发操作,会导致数据不一致性问题。因此数据库管理系统必须提供并发控制的机制,选取合适的控制方法来实现最优性能。当多个事务在数据库中并发执行时,数据的一致性可能受到破坏。系统有必要控制各事务之间的相互作用,这是通过并发控制机制的多种机制中的一种来实现的。

并发控制机制

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

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

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

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

  避免事务”饿死”,授权加锁的条件:不存在在数据项Q上持有与M型锁冲突的锁的其他事务;不存在等待对数据项Q加锁且先于Ti申请加锁的事务。

  常用的机制是各种封锁协议,时间戳排序,有效性检查,多版本机制。

  基本的封锁类型有两种:排它锁(ExclusiveLocks,简称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做任何修改。

  封锁协议是一组阐明了事务合适对数据库中的数据项加锁解锁的规则。两阶段封锁协议仅在一个事务未曾释放任何数据项时允许该事务封锁新数据项。该协议保证可串行性,但不能避免死锁。在缺少有关数据项存取方式的信息是,两阶段封锁协议对保证可串行化来说不仅是必要的而且是充分的。

  树形协议规则:1、Ti的首次加锁可以对任何数据项进行。2、此后Ti对数据项Q加锁的前提是Ti持有Q的父项上的锁。3、对数据项解锁可以随时进行。4、数据项被Ti加锁并解锁后,Ti不能再对该数据项加锁。

  时间戳排序机制通过事先在每对事务之间选择一个顺序来保证可串行性。系统中的每个事务对应一个唯一的固定的时间戳。事务的时间戳决定了事务的可串行化顺序。这样,如果事务Ti的时间戳小于事务Tj时间戳,则该机制保证产生的调度等价于事务Ti出现在事务Tj之前的一个串行调度。该机制通过回滚违反该次序的事务来保证这一点。

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

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

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

#p#分页标题#e#

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

  Thomas写规则:假设事务Ti发出write(Q)操作:

  1、若TS(Ti)<R-timestamp(Q),则Ti产生的Q值是先前所需要的值,但系统已假定该值不会被产生。因此,write操作被拒绝,Ti回滚。

  2、若TS(Ti)<W-timestamp(Q),则Ti试图写入的Q值已过时。因此,这个write操作可悲忽略。

  3、其它情况是执行write操作,将W-timestamp(Q)视为TS(Ti)。

  在大部分事务是只读事务,这样事务见冲突频度较低的情形下,有效性检查机制是一个适当的并发控制机制。系统中的每个事务对应一个唯一的固定的时间戳,串行性次序是由事务的时间戳决定的。在该机制中,事务不会被延迟。不过,事务要完成必须通过有效性检查,如果事务未通过有效性检查,则盖世五回滚到初始状态。

  某些情况下把多个数据项聚为一组,将它们作为聚集数据项来处理效果可能更好,这就导致了多级粒度。小数据项嵌套于大数据项之中。这种层次结果可以图形化地表示为树。封锁按从根结点到叶结点的顺序进行,解锁则按从叶结点到根结点的顺序进行。

  多版本并发控制机制基于每个事务写数据项时为该数据项创建一个新版本。读操作发出时,系统选择其中的一个版本进行读取。利用时间戳,并发控制机制保证确保可串行性的方式选取要读取的版本。

  多版本最常用的技术是时间戳。对于系统中的每个事务Ti,我们将一个静态的唯一的时间戳与之关联,即为TS(Ti)。对于每个数据项Q,有一个版本序列<Q1,Q2,…Qm>与之关联。

  防止死锁的一种方法是使用抢占与事务回滚;另一种方法是死锁检测与恢复机制。系统处于死锁状态当且仅当等待图中包含环。

  活锁的产生原因和解决方法:

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

  当发生死锁后如何解除死锁?

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

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

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

  小编结语:

  更多内容尽在课课家教育~~

    关键字:

在线提交作业