第3章 · 播客 第8集

数据库系统 · 物理设计、事务与封锁协议

🎙️ 本集播客第8集:物理设计三了解与设计目标,事务四特性 ACID 逐项辨析,X 封锁与 S 封锁的差别,一级二级三级封锁协议各自防什么,两段锁协议的可串行化与死锁,封锁粒度与死锁处理——练习题第 5、6、12、14 题的正面战场。 语音由微软 Edge 神经网络语音预生成(女声·晓伊,男声·云希)。点击下方任意对话可直接从该句开始播,当前句朗读时下一句已预先加载,无缝衔接。
🎙️ 第3章播客 第8集
⬇ 下载本集 点击播放
阿明
小雅姐,物理设计这块要背什么?感觉都是 DBA 的活。
小雅
要点不多但都是可考句。数据库在实际的物理设备上的存储结构和存取方法称为数据库的物理结构。数据库物理设计是利用已确定的逻辑结构及 DBMS 提供的方法、技术,以较优的存储结构、数据存取路径、合理的数据存储位置及存储分配,设计出一个高效的、可实现的物理数据库结构。有一句定性:数据库的物理设计是完全依赖于给定的硬件环境和数据库产品的。
阿明
设计者要了解哪几方面?
小雅
原文列了三点:第一,了解并熟悉应用要求,包括各个用户对应的数据视图即数据库的外模式,分清哪些是主要的应用,了解各个应用的使用方式、数据量和处理频率等,以便对时间和空间进行平衡;第二,熟悉使用的 DBMS 的性能,包括 DBMS 的功能,提供的物理环境、存储结构、存取方法和可利用的工具;第三,了解存放数据的外存设备的特性,如物理存储区域的划分原则,物理块的大小等有关规定及输入输出特性。
阿明
存储模式的设计目标呢?是不是也要让用户看懂?
小雅
恰恰不是,这是道辨析题。原文:存储模式和概念模式不一样,它不是面向用户的,一般的用户不一定也不需要了解数据库存储模式的细节。所以数据库存储模式的设计可以不必考虑用户理解的方便,其设计目标主要是提高数据库的性能,其次是节省存储空间。注意主次:性能第一,省空间第二。
阿明
好,物理设计过完。事务那节,ACID 我背得出名字,就是选项一对上就蒙。COMMIT 和 ROLLBACK 先说说?
小雅
先把事务定义背准:数据库系统运行的基本工作单位是事务,事务相当于操作系统中的进程,是用户定义的一个数据库操作序列,这些操作序列要么全做要么全不做,是一个不可分割的工作单位。事务通常以 BEGIN TRANSACTION 也就是事务开始语句开始,以 COMMIT 或 ROLLBACK 语句结束。COMMIT 称为事务提交语句,表示事务执行成功的结束;ROLLBACK 称为事务回退语句,表示事务执行不成功的结束。
阿明
四个特性逐个来,第 5 题考的就是这里。
小雅
逐条念原文:原子性 Atomicity,数据库的逻辑工作单位。一致性 Consistency,使数据库从一个一致性状态变到另一个一致性状态。隔离性 Isolation,不能被其他事务干扰。持续性,也叫永久性,Durability,一旦提交,改变就是永久性的。第 5 题问「一旦提交,改变就是永久性的」指的是哪个,答案持续性,别错选原子性——原子性对应的是「要么全做要么全不做」,从终端用户来看事务是一个原子,是不可分割的操作序列,两者 wording 完全不同。
小雅
干扰项逐个排:隔离性讲的是不能被其他事务干扰,针对并发场景;一致性讲的是状态到状态的迁移。四个特性各配一句口诀:原子性管做不做、一致性管状态、隔离性管干扰、持续性管提交后。
阿明
并发操作会带来什么问题?
小雅
原文列了三个:丢失更新问题;不一致分析问题,读过时的数据;依赖于未提交更新的问题,也就是读了脏数据。这三个问题需要 DBMS 的并发控制子系统来解决,并发控制子系统负责协调并发事务的执行,保证数据库的完整性不受破坏,同时避免用户得到不正确的数据。
阿明
解决手段就是封锁?两种锁先分清。第 14 题考 X 封锁。
小雅
对。第 14 题:排他型封锁简称 X 封锁,如果事务 T 对数据 A 实现了 X 封锁,那么只允许事务 T 读取和修改数据 A,其他事务要等事务 T 解除 X 封锁以后,才能对数据 A 实现任何类型的封锁。可见 X 封锁只允许一个事务独锁某个数据,具有排他性。选项 A 说只允许一个事务独占锁和使用数据,正确。注意 X 封锁的数据 A 可以是数据项、记录、数据集,乃至整个数据库,这个范围也是考点。
小雅
共享型封锁简称 S 封锁,它是因为 X 封锁要求太严产生的:可以允许并发读,但不允许修改。S 封锁的含义是:如果事务 T 对数据 A 实现了 S 封锁,那么允许事务 T 读取数据 A,但不能修改数据 A,在所有 S 封锁解除之前绝不允许任何事务对数据 A 实现 X 封锁。两把锁对照记:X 读写独占,S 只读共享、且 S 在时 X 进不来。
阿明
两把锁对照记住了。还有一点,事务之间的可见性——「从终端用户来看事务是一个原子」这句也是原文?
小雅
是,原文:从终端用户来看,事务是一个原子,是不可分割的操作序列。事务中包括的所有操作要么都做,要么都不做,就效果而言。事务不应该丢失或被分割地完成。这几句是原子性的完整表述,判断题常拿「事务可以只做一半」来考。
阿明
三级封锁协议怎么区分?第 6 题每次都要我命。
小雅
第 6 题问的是能同时防丢失修改、防读脏数据、又保证可重复读的是哪级,答案三级封锁协议。逐级背原文:一级封锁协议,事务 T 在修改数据 R 之前必须先对其加 X 锁,直到事务结束才释放。一级封锁协议可防止丢失修改,并保证事务 T 是可恢复的,但不能保证可重复读和不读脏数据。二级封锁协议,一级封锁协议加上事务 T 在读取数据 R 之前先对其加 S 锁,读完后即可释放 S 锁。二级封锁协议可防止丢失修改,还可防止读脏数据,但不能保证可重复读。
小雅
三级封锁协议,一级封锁协议加上事务 T 在读取数据 R 之前先对其加 S 锁,直到事务结束才释放。三级封锁协议可防止丢失修改、防止读脏数据与防止数据重复读。二级和三级的差别就一个字眼:S 锁读完即释放,还是事务结束才释放。释放晚的管得全。防丢失修改一级就有,防脏数据二级加,可重复读三级才齐。
阿明
第 12 题的两段锁协议,答案是可能发生死锁但并发调度可串行化。
小雅
先背定义:所有事务必须分两个阶段对数据项加锁和解锁。其中扩展阶段是在对任何数据进行读、写操作之前,首先要申请并获得对该数据的封锁;收缩阶段是在释放一个封锁之后,事务不能再申请和获得任何其他封锁。两段就是先只加不放、后只放不加,中间不能来回反复。然后两句结论分开记:第一,若并发执行的所有事务均遵守两段封锁协议,则对这些事务的任何并发调度策略都是可串行化的;第二,遵守两段封锁协议的事务可能发生死锁。
阿明
所以第 12 题的干扰项 A 说「不会发生死锁」,就是把第二个结论反过来。
小雅
对,这是最毒的一个干扰项,把「可串行化」和「无死锁」绑在一起骗人。正确说法是两件事分开:可串行化保住了,死锁挡不住。选项 C「既不会死锁也不需要串行化」、D「一定能防止读脏数据」也都错——两段锁协议和三级封锁协议是两个体系,别混。
阿明
封锁粒度这个概念呢?
小雅
所谓封锁的粒度即是被封锁数据目标的大小。在关系数据库中,封锁粒度有属性值、属性值集、元组、关系、某索引项或整个索引、整个关系数据库、物理页也就是块等几种。规律两句:封锁粒度小则并发性高,但开销大;封锁粒度大则并发性低,但开销小。综合平衡照顾不同需求以合理选取适当的封锁粒度是很重要的。判断题问「封锁粒度越小越好」,答否,要平衡。
阿明
死锁的定义和处理办法?
小雅
所谓死锁是指多个用户申请不同封锁,由于申请者均拥有一部分封锁权而又需等待另外用户拥有的部分封锁而引起的永无休止的等待。一般来讲,死锁是可以避免的,目前采用的办法有两种。第一种预防法:采用一定的操作方式以保证避免死锁的出现,顺序申请法、一次申请法等即是此类方法。顺序申请法指对封锁对象按序编号,在用户申请封锁时必须按编号顺序申请;一次申请法指用户在一个完整操作过程中必须一次性申请它所需要的所有封锁,并在操作结束后一次性归还所有封锁。
小雅
第二种死锁的解除法:允许产生死锁,并在死锁产生后通过解锁程序以解除死锁。这种方法需要有两个程序,一是死锁检测程序,用它测定死锁是否发生,另一是解锁程序,一旦经测定系统已产生死锁则启动解锁程序以解除死锁。题目问「预防死锁的方法有哪些」,答顺序申请法和一次申请法,别把解除法里的检测解锁混进去。
小雅
本集必背:物理设计三了解是应用要求、DBMS 性能、外存设备特性,存储模式设计目标是性能第一省空间第二、不面向用户;事务以 BEGIN TRANSACTION 开始、COMMIT 或 ROLLBACK 结束;ACID 四句:原子性是逻辑工作单位要么全做要么全不做、一致性是从一个一致性状态到另一个、隔离性不能被干扰、持续性一旦提交永久有效;
小雅
并发三问题是丢失更新、读过时数据、读脏数据;X 锁读写独占、S 锁只读共享且 S 在时 X 进不来;一级封锁防丢失修改、二级加防脏数据、三级加可重复读,二级 S 锁读完即释放、三级到事务结束才释放;两段锁协议分扩展和收缩两阶段,遵守则并发调度可串行化但仍可能死锁;粒度小并发高开销大、粒度大反之;防死锁用顺序申请法和一次申请法,解除靠死锁检测程序和解锁程序。
阿明
三级封锁那张递进表我背下了。下一集?
小雅
故障与恢复:四类故障怎么分,事务故障系统故障怎么自动恢复,Redo Undo 队列怎么建,检查点技术和备份恢复的冷热备份、完全增量累积——考试爱考的 Undo Redo 方向都在那。