基于封锁的事务并发控制概述
- 格式:pdf
- 大小:265.52 KB
- 文档页数:3
数据库事务的并发控制机制随着数据量增长和多用户同时对数据库进行读写操作的需求增加,数据库的并发控制机制变得尤为重要。
并发控制机制旨在确保数据库事务在并发环境下能够正确地执行并保持数据的一致性。
在数据库事务中,事务是一个逻辑处理单元,可以由一个或多个数据库操作组成。
并发是指多个事务可以同时执行,但可能会导致问题,例如脏读、不可重复读和幻读。
为了解决这些并发问题,数据库引入了并发控制机制。
数据库事务的并发控制机制主要包括以下几个方面:1. 锁机制:锁是最常用的并发控制技术,它可以通过确保事务读取和修改数据时的独占访问来保证数据的一致性。
常见的锁包括共享锁和排它锁。
共享锁允许多个事务同时读取同一数据,而排它锁则只允许一个事务修改数据。
通过合理的锁定策略,可以有效地避免脏读、不可重复读和幻读等问题。
2. 事务隔离级别:事务隔离级别定义了事务之间的可见性和影响范围,通过设置不同的隔离级别,可以控制事务之间的并发访问。
常见的隔离级别有读未提交、读已提交、可重复读和串行化。
不同的隔离级别对应着不同的并发控制机制,从而可以满足不同场景下的并发需求。
3. 封锁粒度:封锁粒度指的是锁定数据的单位。
合理选择封锁粒度可以提高并发性能。
如果封锁粒度过大,锁的持有时间将增加,导致并发性能下降。
反之,如果封锁粒度过小,锁冲突的概率会增加。
常见的封锁粒度有表级锁和行级锁,具体选择哪种封锁粒度取决于实际需求。
4. 多版本并发控制(MVCC):多版本并发控制是一种基于读-写冲突的并发控制策略。
它通过为每个事务创建一个可见版本来避免锁竞争,从而提高并发性能。
在多版本并发控制下,读操作可以同时进行,并不会被其他事务的写操作阻塞。
常见的实现方式有基于时间戳的多版本并发控制和基于快照的多版本并发控制。
5. 死锁检测和解决:死锁是在并发环境下经常出现的问题,指的是两个或多个事务相互等待对方释放资源而无法继续执行的情况。
为了解决死锁问题,数据库通常会采用死锁检测和解决机制,例如等待图和超时机制。
数据库事务管理中的并发控制技术数据库作为一个关键的数据存储和管理系统,需要支持多个用户同时对数据进行操作。
然而,并发操作可能导致各种数据不一致性的问题,因此数据库管理系统需要使用并发控制技术来保证数据的一致性和可靠性。
本文将介绍数据库事务管理中的并发控制技术。
一、并发控制的概念和背景并发操作是指多个用户同时访问数据库并执行相应的操作。
在并发操作中,可能会出现各种问题,例如丢失更新、不可重复读和幻读等。
为了解决这些问题,数据库管理系统采用了并发控制技术,通过合理地管理并发操作,保证数据的一致性和可靠性。
并发控制的目标是保证事务的隔离性和一致性。
事务的隔离性要求每个事务在执行期间看不到其他事务对数据库所做的改变,事务之间应该相互独立。
事务的一致性要求事务的执行不破坏数据库的完整性和约束。
二、锁定机制锁定机制是一种广泛使用的并发控制技术,它通过为数据库中的数据对象设置锁定状态来控制并发访问。
锁定机制通常分为两种类型:共享锁和排他锁。
共享锁允许多个事务同时读取一个数据对象,而排他锁只允许一个事务对数据对象进行读取或修改。
当一个事务开始时,它可以请求获取共享锁或排它锁。
如果事务需要读取数据对象,则可以请求获取共享锁;如果事务需要修改数据对象,则必须请求获取排它锁。
如果一个事务请求的锁与当前已有的锁没有冲突,那么它将立即获取到锁;如果有冲突,则事务必须等待,直到其他事务释放锁。
锁定机制可以保证并发事务的隔离性和一致性,但它也可能导致问题,如死锁和锁竞争。
死锁是指多个事务互相等待彼此持有的资源,导致所有事务都无法继续执行。
锁竞争是指多个事务争夺同一个资源,导致性能下降和系统响应时间变慢。
为了避免死锁和锁竞争,数据库管理系统通常使用锁定维护和死锁检测机制。
锁定维护机制用于跟踪已经被请求或分配的锁的状态,以避免死锁的发生。
死锁检测机制用于周期性地检查系统中是否出现死锁,如果发现死锁,系统会自动中断其中一个或多个事务,以解除死锁。
数据库事务管理中的锁与并发控制技巧分享数据库事务管理是关系型数据库系统中非常重要的一环,它确保了数据的一致性、隔离性和持久性。
在多用户并发访问数据库时,正确的锁与并发控制技巧能够有效地提高数据库的吞吐量,降低资源竞争,并且保证数据的正确性。
本文将分享一些数据库事务管理中锁与并发控制的技巧与策略。
1. 事务与数据锁在数据库中,事务是一组逻辑上相关的数据库操作,它们被当作一个整体来处理。
事务具有四个特性:原子性、一致性、隔离性和持久性。
为了实现这些特性,数据库通过锁机制对数据进行保护。
数据锁是数据库管理系统中的一种机制,用于控制事务或查询对数据的访问,以确保数据的完整性和一致性。
在数据库事务管理中,锁的类型主要有共享锁和排他锁。
共享锁(Shared Lock)也称为读锁,指示多个事务可以同时读取共享资源,但是不能并发地修改资源。
当一个事务持有共享锁时,其他事务可以继续持有共享锁,但不能获取排他锁。
共享锁用于保证数据的一致性和隔离性。
排他锁(Exclusive Lock)也称为写锁,指示一个事务独占资源并且不与其他事务并发访问。
当一个事务持有排他锁时,其他事务无法同时持有共享锁或排他锁。
排他锁用于确保数据的一致性和隔离性。
2. 并发控制技巧在数据库事务管理中,锁与并发控制技巧是保证数据一致性和隔离性的关键。
以下是一些常用的技巧:a) 读写锁(Read-Write Lock)读写锁是一种特殊的锁机制,它可以同时支持多个读操作,但只能支持一个写操作。
读写锁可以有效提高并发读取性能,因为多个事务可以同时读取共享资源,并且不会相互干扰。
只有在进行写操作时,事务需要获取独占的写锁。
读写锁在数据库事务管理中应用广泛,特别是在读多写少的场景下,可以大幅提高系统的并发性能。
b) 乐观并发控制(Optimistic Concurrency Control)乐观并发控制是一种用于管理事务并发的策略,采用的是乐观的假设,即并发访问的事务之间很少会有冲突。
数据库事务管理的并发控制与故障恢复策略引言数据库事务是数据库管理系统中的关键概念。
它确保了数据库的数据一致性和完整性,并提供了高并发操作的方式。
在数据库中,支持并发操作是很重要的,但同时也引入了并发冲突和故障恢复的问题。
本文将讨论数据库事务管理中的并发控制与故障恢复策略。
一、并发控制并发控制是指在多个事务同时访问数据库时,保证事务之间的数据操作不会发生冲突,从而实现一致性和隔离性。
以下是一些常见的并发控制技术:1. 锁机制锁是最常用的并发控制技术之一。
在事务中,当一个数据项被一个事务锁定时,其他事务就无法访问该数据项,直到锁被释放。
这样可以避免数据的并发写操作引起的冲突。
但是锁的使用需要谨慎,如果锁的粒度过大或者过小都可能导致锁竞争问题。
因此,选择合适的锁粒度对提高并发性能非常重要。
2. 并发控制方法并发控制方法分为两类:乐观并发控制和悲观并发控制。
乐观并发控制假设事务之间的冲突很少发生,只在提交时检查是否发生了冲突;而悲观并发控制则假设冲突会频繁发生,因此在事务执行期间一直持有锁。
常见的乐观并发控制方法包括多版本并发控制(MVCC)和时间戳机制。
悲观并发控制方法包括共享锁和排他锁等。
3. 事务隔离级别事务隔离级别定义了事务之间的隔离程度,包括读未提交、读已提交、可重复读和可串行化。
不同的隔离级别提供了不同程度的并发性和数据一致性保证。
选择合适的隔离级别是一个权衡问题。
二、故障恢复策略故障恢复策略是处理数据库异常情况的方法,包括硬件故障和软件故障。
数据库的故障恢复策略主要包括以下内容:1. 日志系统日志系统用于记录数据库操作的序列,包括数据修改操作和事务提交信息。
通过将这些操作记录到日志中,可以在系统故障后恢复数据。
常见的日志系统包括逻辑日志和物理日志,其中物理日志比较常用。
2. 检查点检查点是在系统正常运行时定期将内存中的数据和日志信息持久化到磁盘上的一个时间点。
通过检查点,可以减少故障恢复所需的时间。
数据库事务处理中的并发控制技术在数据库系统中,事务是一组需要作为一个原子单元进行执行的操作,要么全部执行成功,要么全部失败回滚。
并发控制是保证多个事务并发执行时,数据的一致性和完整性的技术。
在多用户环境下,数据库并发操作是一项关键技术,因此数据库事务处理中的并发控制技术至关重要。
一、并发控制概述当多个事务同时访问数据库并对数据库进行读写操作时,可能会出现各种问题,如丢失更新、脏读、不可重复读、幻影读等。
为了解决这些问题,需要采取适当的并发控制机制。
并发控制的目标是提高系统的性能、保证数据的一致性、避免冲突和死锁等问题的发生。
二、锁定技术锁定技术是最常见也是最基本的并发控制技术,通过锁定数据项或资源,限制并发事务的访问和操作。
在事务执行期间,所涉及的数据项被加上锁并且在事务结束时才释放锁,从而确保每个事务的操作是原子性的。
常见的锁定技术包括:1. 共享锁(Shared Lock):多个事务可以同时获取相同的共享锁,用于读操作。
共享锁之间不互斥,可以并发访问。
2. 排他锁(Exclusive Lock):排他锁会阻塞其他事务对于资源的访问,只允许一个事务独占该资源,用于写操作。
3. 间隙锁(Gap Lock):间隙锁用于锁住一个范围内的间隔,阻止其他事务插入该范围的记录。
防止幻影读问题的发生。
锁定技术的优点是简单易懂,但是并发性能较差,并且容易导致死锁等问题的发生。
三、多版本并发控制(MVCC)多版本并发控制(MVCC)是一种相对于传统锁定技术的的并发控制技术。
它允许不同的事务同时读取和操作数据库的不同版本,从而避免了锁的竞争和冲突。
在MVCC中,每个事务在执行时都能看到一个一致性的快照,这个快照代表了它在事务开始时的数据库状态。
当事务开始时,数据库将为每个事务生成一个唯一的时间戳,并与数据库的每个数据项关联。
当有一个事务想要读取或写入一个数据项时,系统将检查该事务的时间戳,以确定是否可以读取或修改数据项。
数据库事务管理与并发控制数据库事务管理与并发控制是数据库系统中非常重要的概念和技术,它们对于确保数据库的一致性、可靠性以及高效性起着至关重要的作用。
本文将详细介绍数据库事务管理和并发控制的概念、原理以及相关技术。
一、数据库事务管理数据库事务是指作为一个逻辑单位执行的一系列数据库操作,它具有以下特性:原子性、一致性、隔离性和持久性,即被称为ACID特性。
原子性指事务中的操作要么全部成功执行,要么全部失败回滚。
一致性指事务执行前后数据库的状态保持一致。
隔离性指多个事务并发执行时,每个事务都感觉不到其他事务的存在。
持久性指一旦事务提交,其结果将永久保存在数据库中。
数据库事务管理的目标是确保数据库在多用户并发访问的情况下保持一致性和可靠性。
为实现这一目标,数据库管理系统提供了事务的提交和回滚机制。
事务提交指将事务中的操作永久保存到数据库中,事务回滚指放弃事务中的操作,将数据库恢复到事务执行前的状态。
数据库事务管理的主要技术包括日志记录、锁机制和并发控制。
日志记录用于记录事务执行的过程,以便在发生故障时恢复数据库状态。
锁机制用于控制并发访问,避免多个事务同时对同一数据进行修改造成的冲突。
并发控制用于解决多个事务并发执行时可能引发的各种问题,如丢失修改、脏读、不可重复读和幻影读。
二、并发控制并发控制是指在多个事务同时执行时,通过一定的机制和策略保证事务的正确执行和数据的一致性。
并发控制的目标是提高数据库系统的并发性和性能,同时避免各种并发访问可能引发的问题。
常用的并发控制技术包括封锁协议、时间戳法和多版本并发控制。
封锁协议是一种基于锁机制的并发控制方法,通过对数据项进行加锁和解锁来确保事务的串行执行。
封锁协议分为两种:共享锁和排他锁,分别用于读和写操作。
时间戳法是一种基于时间戳的并发控制方法,通过为每个事务分配唯一的时间戳来确定其执行顺序,从而避免冲突。
多版本并发控制是一种通过保存数据的不同版本来实现并发控制的方法,读操作可以读取旧版本的数据,写操作则会引入新版本。
数据库事务的并发控制与锁机制随着数据库在各个领域的广泛应用,数据库系统的性能和并发能力成为了关注的重点之一。
然而,并发操作也带来了一系列的问题,比如数据丢失、读取脏数据等,因此数据库事务的并发控制与锁机制显得尤为重要。
本文将探讨数据库事务的并发控制策略以及常用的锁机制,以期帮助读者更好地理解并发控制的原理和方法。
一、数据库事务数据库事务是指作为一个逻辑工作单元执行的一系列数据库操作。
事务应具备以下四个特性(ACID):原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。
为了提高数据库的并发性能,数据库管理系统(DBMS)会允许多个事务同时执行。
然而,多个事务并发执行时可能会产生冲突,如读-写冲突、写-写冲突等。
因此,需要采取相应的并发控制策略,保证事务的一致性和正确性。
二、并发控制策略1. 串行化串行化是一种简单粗暴的并发控制策略,即每次只允许一个事务执行,其他事务等待。
串行化能够避免并发冲突,但会限制并发能力,降低系统的吞吐量。
2. 乐观并发控制(Optimistic Concurrency Control,OCC)乐观并发控制是基于假设冲突不经常发生的策略。
该策略允许多个事务同时执行,但在提交时验证是否冲突。
若产生冲突,则会回滚事务并重新执行。
乐观并发控制减少了锁的开销,提高了并发性能,但在冲突频繁的场景下会带来较大的性能损失。
3. 悲观并发控制(Pessimistic Concurrency Control,PCC)悲观并发控制是基于假设冲突经常发生的策略。
该策略在事务执行前会为所有访问的数据加锁,直到事务提交后才释放锁。
悲观并发控制保证了数据的一致性,但会增加锁的冲突和开销,降低系统的并发能力。
三、锁机制锁机制是实现并发控制的关键。
常见的锁机制包括共享锁(Shared Lock)和排他锁(Exclusive Lock)。
数据库锁定与事务的并发控制技术研究概述:数据库是现代信息系统中的关键组成部分,为了保证数据的一致性、并发性和完整性,数据库必须提供有效的并发控制机制。
数据库锁定与事务的并发控制技术是其中最重要的一部分。
本文将讨论数据库锁定与并发控制技术的基本概念和原则,以及最常见的锁类型和事务隔离级别,同时还会探讨一些常见的并发控制技术。
一、数据库锁定概念与原则数据库锁定是为了控制对数据库对象的访问而引入的一种机制。
它通过限制并发操作来确保数据在并发访问时的一致性和完整性。
在实施并发控制时,应遵循以下原则:1. 互斥性原则:同一时间只能有一个事务对某个数据进行操作。
如果一个事务获得了某个数据资源的锁定,则其他事务必须等待该锁释放后才可继续执行。
2. 持续性原则:事务开始前所设置的锁定应保持到事务结束。
3. 有序性原则:事务获得锁的顺序应按照一定的规则进行,避免出现死锁。
二、常见的锁类型1. 排他锁(Exclusive Lock):也称为写锁,一个事务在持有排他锁时,其他事务无法读取或修改数据。
2. 共享锁(Shared Lock):也称为读锁,多个事务可以同时持有共享锁,但是无法持有排他锁。
3. 行级锁(Row Lock):在多行记录上独立设置的锁,可以精确控制对数据库的并发访问。
4. 表级锁(Table Lock):对整个表进行锁定,常用于对整个表进行大量修改的场景。
三、事务隔离级别事务隔离级别是数据库管理系统中用于控制事务之间相互影响的一种机制。
数据库事务的隔离级别从低到高可以分为:未提交读(Read Uncommitted)、提交读(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。
1. 未提交读(Read Uncommitted):该级别下,事务可以读取到其他事务未提交的数据。
这种级别下读取到的数据可能是脏数据,存在数据不一致的风险。
2. 提交读(Read Committed):该级别下,事务只能读取到其他事务已经提交的数据。
基于封锁的事务并发控制概述发表时间:2010-05-14T10:46:24.013Z 来源:《计算机光盘软件与应用》2010年第4期供稿作者:卢成浪,徐湖鹏[导读] 叙述了关系型数据库管理系统中的事务管理和基于锁的事务并发控制方法。
卢成浪,徐湖鹏(温州大学瓯江学院,温州 325035)摘要:叙述了关系型数据库管理系统中的事务管理和基于锁的事务并发控制方法。
详细介绍了事务的串行化调度方法中的锁技术和锁协议,并深入讨论了锁的管理、死锁处理、幻影问题和其它加锁过程中可能出现的一些问题。
关键词:数据库管理系统;事务;并发控制;封锁中图分类号:TP311.131 文献标识码:A 文章编号:1007-9599 (2010) 04-0000-03Lock-Based Transaction Concurrency Control OverviewLu Chenglang,Xu Hupeng(Wenzhou University,Oujiang College,Wenzhou 325035,China)Abstract:An overview on the management of lock-based concurrency control of transactions is presented in this paper.The locking protocols and locking techniques of the locking are discussed in depth.Keywords:Database management systems;Transaction;Concurrency control;Lock一、引言事务是用户定义的一组数据库操作序列。
事务的执行结果将使数据库从一个一致性状态转变到另一个一致性状态。
为了提高吞吐量,系统中常常是多个事务并发执行。
这会产生多个事务同时存取同一数据的情况,从而破坏数据库的一致性。
所以数据库管理系统(Database Management System,DBMS)必须提供并发控制机制,使得并发的事务在冲突的时候被串行化执行。
这种调度称为可串行化调度。
其中基于封锁的并发控制机制是一种被广泛应用于商业DBMS中的并发控制机制。
二、事务的特性和并发的数据不一致性事务具有ACID特性:原子性(Atomicity),一致性(Consistency),隔离性(Isolation)和持续性(Durability)。
原子性指:事务包含的所有操作要么全部被执行,要么都不被执行;一致性指:事务的执行结果必须使数据库从一个一致性状态变到另一个一致性状态;隔离性指:在事务被提交以前,其操作结果对于其他事务不可见;持续性指:一旦事务成功提交,其对数据库中数据的改变是永久的。
事务是并发控制的基本单位,保证事务的ACID特性是事务处理的重要任务。
然而,事务的并发执行可能会破坏事务的ACID特性,而导致数据的不一致性:(一)Write-Write冲突,丢失更新。
它是由于事务之间的写冲突造成的。
两个事务T1和T2同时读入同一数据并修改,T2的提交破坏了T1的提交结果,导致T1的修改丢失。
(二)Read-Write冲突,也称不一致读。
不一致读是指事务T1读取数据后,事务T2执行更新操作,使T1无法再现前一次读取结果。
它包括三种情况:1.T1读取某一数据后, T2对其做了修改,当T1再次读取该数据时,得到与前一次不同的值;2.T1按一定的条件从数据库中读取了某些记录后,T2删除其中部分记录,当T1再次按相同条件读取数据时,发现某些记录神秘的消失了;3.T1按一定的条件从数据库中读取了某些记录后,T2插入了一些记录,当T1再次按相同条件读取数据时,发现多了一些记录。
后两种情况也称幻影现象。
(三)Write-Read冲突,也称读脏数据。
读脏数据指事务T1修改某数据,事务T2读取同一数据后,T1由于某种原因被撤销,这时T1已修改过的数据恢复原值,T2读到的数据就与数据中的数据不一致,则称T2读到的数据就为脏数据。
三、基于封锁的事务并发控制机制(一)锁的类型封锁是实现并发控制的一个非常重要的技术。
所谓封锁就是事务T在对某个数据对象例如表,记录等操作之前,先向系统发出请求,对其加锁。
加锁后事务T就对该数据对象有了一定的控制,在事务T释放它之前,其他事务不能更新该数据对象。
下面介绍DBMS涉及的锁:1.互斥锁(Exclusive Lock):用于写操作,又称写锁或者排他锁,记做X锁。
若事务T对数据对象A加上X锁,则只允许T读写A,其他事务都不能对A加任何锁,直到T释放A上的锁。
2.共享锁(Shared Lock):用于读操作,又称读锁,记做S锁。
若事务T对数据对象A加上S锁,则T可读A但不能写A,其他事务只能对A加S锁,而不能加X锁,直到T释放锁。
3.更新锁(Update Lock):用于更新操作。
等价于先加共享锁,在真正执行更新操作时,将共享锁升级为互斥锁。
大部分DMBS 都不使用这种锁。
4.增量锁(Increment Lock):用于增量操作,如果一个对象被上了增量锁,除增量操作以外任何读写操作都是被禁止的。
即增量锁之间不排斥。
因同时对某一对象的数值进行加一或者减一操作时,其结果与操作先后顺序是无关的,可以交换。
这种锁使用并不广泛。
5.意向锁(Intention Lock):它是因为引入多粒度对象而产生的,又可细分为:意向共享锁,意向排他锁和共享意向排他锁。
在DBMS 中被广泛使用的是共享锁,互斥锁和意向锁。
为了保证写操作的互斥性,不同事务对同一数据对象加锁时需要进行冲突检测。
检测可以借助锁的相容矩阵来判断,如图1(a)所示。
从中可以发现5种锁的强度偏序关系,如图1(b)所示。
(二)加锁管理和锁转换DBMS中处理事务加锁事宜的部分被称为锁管理器。
锁管理器维护着一个锁表,这是一个以数据对象标志为码的哈希表。
DBMS也在事务表中维护着每个事务的描述信息项,该记录中包含一个指向事务拥有的锁列表的指针。
在请求锁之前要检查这个列表,以确定不会对同一个锁请求两次。
加锁表中的每一项针对某个数据对象(可以是一页,一条记录等等),它包括下面的信息:拥有数据对象锁的事务数目,锁的属性(共享锁、互斥锁等)和一个指向加锁请求队列的指针。
1.加锁和解锁请求的实现。
当事务需要某个对象的锁时,需要将请求提交给锁管理器。
如果请求的是共享锁,当前请求队列为空,而且该对象没有处于互斥锁状态时,锁管理器就将同一加锁请求,并更新该对象的相应的锁表数据项。
如果请求的是互斥锁,并且没有事务拥有该对象的锁,那么锁管理器可以同意加锁请求,并更新该对象的相应锁表数据项。
对于其它情况,加锁请求不能立刻得到满足,加锁请求将被添加到该对象的加锁请求队列中,同时挂起请求加锁的事务。
当事务中止或者提交时,会释放自己拥有的锁。
当某个对象被释放时,锁管理器更新相应锁表数据项,并检查该对象的加锁请求队列。
如果请求能被接受,请求锁的事务将被唤醒并得到锁。
其中,加锁和解锁操作必须是原子操作。
为确保这两个操作的原子性,锁管理器需要使用操作系统的同步机制来小心的访问锁表。
2.锁转换。
事务可能需要对已经获得了共享锁的对象再请求排他锁。
此时,如果没有其他事务拥有该对象的共享锁,可以立即对事务的锁进行升级满足互斥锁请求,否则将该加锁请求加到等待队列的最前面。
但是,使用锁的升级不能避免由冲突更新操作导致的死锁。
例如,如果两个事务已经获得了一个对象的共享锁,又请求排他锁,就会导致死锁。
一个更好的法子是不进行锁升级,而是在开始时首先获得排他锁,当知道只需要共享锁就足够了时,再对锁降级。
但该方法又将会导致在某型情况下事务并需要排他锁时,降低了系统的并发度。
但是从整体来讲,它通过减少死锁改善了吞吐量。
因此该方法在目前的商用DBMS中被广泛使用。
并发度的问题可以通过引入前面提到的更新锁来改善。
在事务开始时申请更新锁而不是排他锁,就可以防止与读操作的冲突。
一旦确定不要对对象进行更新,就可以将锁降级为共享锁。
如果需要更新对象,则可以将锁升级为排他锁。
3.并发调度的可串行性和两段锁协议。
计算机系统对并发事务中并发操作的调度是随机的,而不同的调度可能会产生不同的结果。
其正确性的评判标准是:并发调度的可串行性。
即多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行的执行它们时的结果相同。
两段锁(Two Phase Locking,简称2PL)协议就是保证并发调度可串行性的封锁协议。
所谓“两段”的含义是,事务分为两个阶段,第一阶段是获得封锁,也成为扩张阶段。
在该阶段,事务可以申请获得任何数据项上的任何类型的锁,但不能释放任何锁。
第二阶段是释放锁,也成为收缩阶段。
在该阶段,事务可以释放其拥有的数据项上的任何类型的锁,但是不能再申请任何锁。
但是由于一个事务是由若干操作组成的,因此在实际执行过程中,很难判断一个事务还会不会再提出锁请求。
一种比较实用的方案就是:事务将一直保持它在执行过程中获得的所有的锁,直到该事务被提交或者撤销时才释放它们。
两阶段锁协议的工作流程可概括为:开始事务;在读数据前获得共享锁,在写操作前获得互斥锁,并在获取锁时进行锁的冲突检测;进行读/写操作;释放事务拥有的共享锁;结束事务(提交或者撤销);释放所有的本事务所持有的互斥锁。
4、封锁的粒度。
封锁对象的大小称为粒度。
目前,在商用DBMS中,最小锁定对象是记录,最大对象是表。
锁定的对象可以是一张数据表,一个页面或一条记录,甚至是一条记录中的某个字段。
封锁粒度与系统的并发度和并发控制的开销密切相关。
封锁的粒度越大,数据所能够封锁的数据单元就越少,并发度就越小,系统开销也越小;反之,封锁的粒度越小,并发度越高,系统开销也越大。
因此,如果在一个系统中同时支持多种封锁力度是比较理想的,这种封锁方法称为多粒度锁。
多粒度锁虽然灵活,但也带来了一个新的问题:具有隶属关系的锁定对象如何检测到对方的存在。
比如对于一个被上了表级写锁的数据表,尽管该表中的记录并没有被显示加锁,但应禁止对其包含的记录进行读写。
反之,对已经加了记录级写锁的记录,也不能对它所属的表再加读锁。
为此人们引入了意向锁来解决这个问题。
意向锁的含义是如果对一个对象上意向锁,则说明它的某个下一级对象要被加锁。
显然,要对小粒度对象上锁,必须先对其所属的上级对象加意向锁;要释放小粒度对象的锁,必须先释放本身,然后释放其上层对象的意向锁。
意向锁有三类:IS,IX 和SIX。
如果对一个数据对象加IS锁,表示它的下一级对象拟加S锁,比如想对某记录上读锁,那么就需先对其所属的表加IS锁,然后再对指定记录加读锁;如果对一个数据对象加IX锁,表示它的下一级对象拟加X锁;如果要对一个数据对象加SIX锁,表示对它加S锁,再加IX锁。