封锁是实现并发控制的重要技术,通过对数据对象加锁来限制其他事务对该对象的访问

张开发
2026/4/15 5:08:13 15 分钟阅读

分享文章

封锁是实现并发控制的重要技术,通过对数据对象加锁来限制其他事务对该对象的访问
封锁是实现并发控制的重要技术通过对数据对象加锁来限制其他事务对该对象的访问。常见的封锁协议分为三级一级封锁协议事务在修改数据R之前必须先对其加X锁排他锁直到事务结束才释放。一级封锁协议可以解决丢失修改问题但无法保证可重复读和防止读脏数据。二级封锁协议在一级封锁协议的基础上事务在读数据R之前必须先对其加S锁共享锁读完后即可释放S锁。二级封锁协议除了防止丢失修改外还可以解决读脏数据问题但无法保证可重复读。三级封锁协议在一级封锁协议的基础上事务在读数据R之前必须先对其加S锁直到事务结束时才释放S锁。三级封锁协议除了防止丢失修改和读脏数据外还进一步防止了不可重复读问题。2. 活锁与死锁活锁指当事务T₁封锁了数据R时事务T₂请求封锁R于是T₂等待当T₁释放了R上的封锁后系统首先批准了T₃请求T₂仍等待当T₃释放了R上的封锁后又批准了T₄请求依此类推使得T₂可能永远等待的现象。活锁可以通过先来先服务的封锁请求调度策略避免。死锁指两个以上的事务分别请求封锁对方已经封锁的数据导致长期等待而无法继续运行下去的现象。死锁的四个必要条件是互斥条件、请求和保持条件、不可剥夺条件、循环等待条件。可以通过一次封锁法、顺序封锁法等策略预防死锁也可通过超时法、等待图法检测死锁并解除。3. 并发调度的可串行性多个事务的并发执行是正确的当且仅当其结果与某一次序串行执行它们时的结果相同这种调度策略称为可串行化的调度。可串行性是并发事务正确性的准则按这个准则规定一个给定的并发调度当且仅当它是可串行化的才认为是正确调度。4. 两段封锁协议所谓两段封锁协议是指所有事务必须分两个阶段对数据项加锁和解锁第一阶段获得封锁事务可以获得任何数据项上的任何类型的锁但不能释放。第二阶段释放封锁事务可以释放任何数据项上的任何类型的锁但不能申请。两段锁协议是保证并发调度可串行性的充分条件遵循两段锁协议的事务调度一定是可串行化的。5. 封锁的粒度封锁对象的大小称为封锁的粒度。封锁的对象可以是逻辑单元如属性、元组、关系、索引项、整个索引甚至整个数据库也可以是物理单元如数据页或索引页。封锁粒度与系统的并发度和开销密切相关粒度越小并发度越高但锁管理开销也越大粒度越大并发度越低锁管理开销越小。二、考试试题一单项选择题每题2分共20分在数据库系统中解决并发操作带来的数据不一致问题普遍采用 技术。A. 封锁B. 存取控制C. 恢复D. 协商一级封锁协议可以解决以下哪种并发问题 。A. 丢失修改B. 不可重复读C. 读脏数据D. 死锁二级封锁协议在一级封锁协议的基础上增加了 。A. 事务在修改数据R之前必须先对其加X锁直到事务结束才释放B. 事务在读数据R之前必须先对其加S锁读完后即可释放S锁C. 事务在读数据R之前必须先对其加S锁直到事务结束才释放S锁D. 事务在读数据R之前必须先对其加X锁读完后即可释放X锁以下哪种封锁协议可以同时解决丢失修改、读脏数据和不可重复读问题 。A. 一级封锁协议B. 二级封锁协议C. 三级封锁协议D. 两段封锁协议关于两段封锁协议以下说法错误的是 。A. 事务分为两个阶段获得封锁阶段和释放封锁阶段B. 获得封锁阶段只能申请锁不能释放锁C. 释放封锁阶段只能释放锁不能申请锁D. 遵循两段封锁协议的调度一定是正确的不会发生死锁以下哪种情况会导致活锁 。A. 事务T1持有锁L1请求锁L2事务T2持有锁L2请求锁L1B. 事务T1封锁了数据R事务T2请求封锁RT1释放R后系统总是优先批准其他事务的封锁请求导致T2长期等待C. 两个事务同时读取同一数据项D. 两个事务同时修改同一数据项可串行化调度是指 。A. 多个事务串行执行的调度B. 多个事务并发执行的结果与某一次序串行执行的结果相同C. 多个事务按照时间顺序依次执行D. 多个事务不会发生冲突的调度如果事务T获得了数据项Q上的排他锁X锁则T对Q 。A. 只能读不能写B. 只能写不能读C. 既可读又可写D. 不能读也不能写以下哪种操作不会发生冲突 。A. T1正在写AT2要读AB. T1正在写AT2也要写AC. T1正在读AT2要写AD. T1正在读AT2也要读A死锁的四个必要条件中不包括 。A. 互斥条件B. 可剥夺条件C. 请求和保持条件D. 循环等待条件二多项选择题每题3分共15分并发操作可能带来的数据不一致性问题包括 。A. 丢失修改B. 不可重复读C. 读脏数据D. 死锁E. 活锁常见的封锁类型包括 。A. 共享锁S锁B. 排他锁X锁C. 读写锁D. 意向锁E. 时间戳以下关于封锁粒度的说法正确的是 。A. 封锁粒度越大系统的并发度越高B. 封锁粒度越小系统的并发度越高C. 封锁粒度越大锁管理的开销越小D. 封锁粒度越小锁管理的开销越小E. 选择封锁粒度时需要在并发度和锁开销之间进行权衡死锁的预防策略包括 。A. 一次封锁法B. 顺序封锁法C. 先来先服务D. 超时法E. 等待图法以下关于两段封锁协议的说法正确的是 。A. 两段封锁协议是保证调度可串行性的充分条件B. 遵循两段封锁协议的调度一定是可串行化的C. 遵循两段封锁协议的调度不会发生死锁D. 两段封锁协议要求所有事务必须分两个阶段对数据项加锁和解锁E. 两段封锁协议中事务在释放锁之后不能再申请任何锁三判断题每题2分共10分一级封锁协议可以防止读脏数据问题。 二级封锁协议可以保证可重复读。 三级封锁协议要求事务在读数据前加S锁直到事务结束才释放。 可串行性是并发事务正确性的判断准则。 两段封锁协议可以避免死锁的发生。 四简答题每题5分共20分简述三级封锁协议的内容以及各自能解决的并发问题。解释活锁和死锁的概念并说明如何预防和解决。什么是可串行化调度为什么可串行化调度是正确的简述两段封锁协议的内容及其作用。五综合题每题15分共15分设有两个事务T1和T2其操作序列如下T1读AA A - 100写回A读BB B 100写回BT2读BB B - 100写回B读AA A 100写回A假设A和B的初始值都为1000。如果这两个事务串行执行先执行T1再执行T2或先执行T2再执行T1请分别计算执行后的A和B的值。现有一个并发调度如下T1读A → T2读B → T1写回A → T2写回B → T1读B → T2读A → T1写回B → T2写回A请计算该调度执行后的A和B的值并判断该调度是否是可串行化调度说明理由。如果使用三级封锁协议请描述上述并发调度的执行过程并说明最终结果是否正确。三、试题答案一单项选择题答案AABCDBBCDB二多项选择题答案ABCABBCEABABDE三判断题答案× 解析一级封锁协议只能解决丢失修改问题无法防止读脏数据。× 解析二级封锁协议读完数据后即可释放S锁无法保证可重复读。√√× 解析两段封锁协议不能避免死锁反而可能增加死锁发生的概率。四简答题答案三级封锁协议内容及解决的问题一级封锁协议事务在修改数据R之前必须先对其加X锁直到事务结束才释放。可以解决丢失修改问题。二级封锁协议在一级封锁协议基础上事务在读数据R之前必须先对其加S锁读完后即可释放S锁。可以解决丢失修改和读脏数据问题。三级封锁协议在一级封锁协议基础上事务在读数据R之前必须先对其加S锁直到事务结束才释放S锁。可以解决丢失修改、读脏数据和不可重复读问题。活锁与死锁活锁指事务请求封锁数据时由于其他事务不断获得该数据的封锁导致该事务长期等待的现象。活锁可以通过先来先服务的调度策略避免。死锁指两个或多个事务互相等待对方持有的封锁导致都无法继续执行的现象。死锁的预防策略包括一次封锁法事务一次性申请所有需要的锁和顺序封锁法规定所有事务按照相同顺序申请锁死锁的检测方法包括超时法和等待图法检测到死锁后可以通过撤销代价最小的事务来解除死锁。可串行化调度可串行化调度是指多个事务并发执行的结果与某一次序串行执行这些事务的结果相同。由于串行执行的事务不会互相干扰其结果一定是正确的因此如果并发调度的结果与某一串行执行结果相同那么该调度就是正确的。两段封锁协议两段封锁协议要求所有事务必须分两个阶段对数据项加锁和解锁第一阶段是获得封锁阶段事务可以申请任何数据项上的任何类型的锁但不能释放任何锁第二阶段是释放封锁阶段事务可以释放任何数据项上的任何类型的锁但不能再申请任何锁。两段封锁协议是保证并发调度可串行性的充分条件遵循两段封锁协议的调度一定是可串行化的。五综合题答案串行执行结果先执行T1再执行T2T1执行后A 900B 1100T2执行后B 1000A 1000最终结果A1000B1000先执行T2再执行T1T2执行后B 900A 1100T1执行后A 1000B 1000最终结果A1000B1000并发调度结果执行过程T1读A1000 → T2读B1000 → T1写回A900 → T2写回B900 → T1读B900 → T2读A900 → T1写回B1000 → T2写回A1000最终结果A1000B1000该调度是可串行化调度因为其结果与两种串行执行的结果都相同。三级封锁协议下的执行过程T1开始先申请A的X锁获得后读A1000修改为900并写回。T2开始申请B的X锁获得后读B1000修改为900并写回。T1申请B的X锁此时B已被T2加了X锁T1等待。T2申请A的X锁此时A已被T1加了X锁T2等待。此时发生死锁两个事务都无法继续执行。系统需要检测到死锁并撤销其中一个事务释放其持有的锁另一个事务才能继续执行最终结果会与串行执行结果一致是正确的。

更多文章