数据库并发控制
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 的并发控制机制。
分享到:
相关推荐
数据库并发控制是数据库管理系统中的关键组成部分,特别是在多用户系统中,确保数据的一致性和完整性至关重要。并发控制的主要目的是防止多个事务在访问共享资源时产生不正确的数据状态,从而避免诸如丢失更新、脏读...
分布式数据库并发控制是数据库系统中的一个重要领域,尤其在多处理器或多节点环境中,多个事务可能同时对数据库进行操作,这就会引入一系列并发问题。并发执行在单处理器和多处理器环境下都有可能发生,不同的是,在...
数据库并发控制PPT学习教案 数据库并发控制是数据库管理系统(DBMS)中一个非常重要的概念。它是指在多个事务同时访问数据库时,如何确保事务之间的一致性和隔离性,防止数据不一致和丢失。 在数据库并发控制中,...
### 数据库并发控制的基本方法 #### 一、并发控制概览 在数据库系统中,**并发控制**是一项关键的技术,用于确保多个事务能够同时访问数据而不引起数据不一致的问题。并发控制的目标是使得多个事务的并发执行看...
数据库并发控制及SQL 包含内容包括:数据库并发控制及SQL Server的并发控制机制 事务及并发控制的基本概念 封锁机制 SQL Server的并发控制机制 等等
数据库并发控制是确保多个用户或应用程序能够同时访问数据库时,数据的完整性和一致性得到保障的重要机制。此外,它还旨在优化数据库的性能,避免因并发操作导致的数据竞争、死锁等问题。本文将详细介绍数据库并发...
数据库并发控制是确保数据一致性、防止数据竞争和死锁的重要手段。通过合理设置事务隔离级别、使用锁定机制、实施乐观或悲观并发控制策略、预防和解决死锁以及性能优化,可以有效地处理数据库的并发问题。同时,遵循...
希望读者能够通过本文,对数据库并发控制有更深入的理解,并在自己的项目中应用这些策略和技术。 本文详细介绍了数据库并发控制的不同策略和技术,包括锁机制、MVCC、乐观与悲观并发控制,以及事务隔离级别的选择和...
本文将详细介绍数据库并发控制的概念、重要性、常见策略以及实现方法。 数据库并发控制是确保多用户环境下数据一致性和完整性的重要机制。通过本文的探讨,我们了解到了并发控制的重要性、常见策略以及实现方法。...
该课件具体系统的讲述了数据库并发控制,很实用。
### 数据库并发控制及其在SQL Server 2000中的应用 #### 一、并发控制概述 在现代数据库管理系统(DBMS)中,**并发控制**是一项关键的技术,尤其是在多用户环境中,它确保了多个事务能够同时访问数据库而不会导致...
根据提供的文件信息,我们可以深入探讨数据库并发控制的关键概念和技术,特别是封锁和并发调度的重要性及其应用场景。 ### 数据库并发控制 数据库并发控制的核心在于确保多用户环境下的数据完整性及一致性。在多...
### 数据库并发控制技术解析 #### 一、引言 在多用户环境下,数据库系统面临着如何有效管理和控制多个用户或应用程序同时访问同一份数据的问题。并发控制是数据库管理系统(DBMS)的重要组成部分,它确保了即使在高...
数据库并发控制是数据库管理系统(DBMS)中至关重要的一个部分,它确保了在多事务环境中,数据的正确性和一致性。SQL Server作为一款广泛使用的数据库管理系统,同样具备强大的并发控制机制来处理多用户同时访问...
实验12的主题聚焦于数据库并发控制,这是一个在数据库系统中至关重要的概念,特别是在多用户同时访问数据库时确保数据一致性与正确性的关键环节。本实验旨在让学生深入理解并发控制的原理和常见问题,如脏读。 ...
作者首先介绍了分布式数据库并发控制的重要性和并发问题的类型,包括丢失修改、不可重复读和读脏数据。接着,详细分析了锁和时间戳这两种并发控制方法的原理和优缺点。最后,详细阐述了在VS2008开发环境和SQL Server...
数据库并发控制是数据库管理系统(DBMS)中至关重要的一个方面,它确保在多用户环境中,事务的正确执行和数据的一致性。SQL Server作为一款广泛使用的数据库系统,提供了高效的并发控制机制来解决并发操作可能引发的...