数据库封锁协议到底有几级?并发控制三道防线一次讲清

分类: 数据库系统工程师、 软考中级 发表时间:2026年07月30日 09:15

数据库封锁协议到底有几级?并发控制三道防线一次讲清

数据库系统中,当多个事务同时操作同一份数据时,如果不加任何控制,就可能导致数据不一致。软考数据库系统工程师考试中,并发控制与封锁协议每年必出,考生丢分最多的地方并不是记不住概念,而是搞不清三级封锁协议各自解决了什么问题,以及两段锁协议与封锁协议之间到底是什么关系。本文从并发冲突的本质出发,逐层拆解封锁机制,帮助读者建立从问题到方案的完整认知链条。

一、并发操作到底会引发什么问题

数据库并发控制要解决的核心问题,可以归结为事务并发执行时相互干扰导致的三种数据不一致现象。理解这三种现象是掌握封锁协议的前提。

事务是数据库操作的基本逻辑单元,具有原子性、一致性、隔离性和持久性四大特性。当多个事务以交替方式并发执行时,虽然提高了系统的吞吐率和资源利用率,但也破坏了事务之间的隔离性。不加控制的并发调度,可能产生以下三类典型问题。

丢失修改:你改了我白改了

丢失修改是最基本的并发冲突。假设银行账户A的初始余额为1000元,事务T1要取出100元,事务T2要存入200元。按正确逻辑,最终余额应为1100元。但如果两个事务的读写操作交错执行,T1读取余额1000,T2也读取余额1000,随后T1计算出900并写回,T2计算出1200并写回——T1的修改被T2覆盖,仿佛从未发生。这就是丢失修改。

丢失修改的本质是两个事务基于同一份旧数据分别做了计算,后写入的事务覆盖了先写入事务的结果。在数据库理论中,这被称为"写-写冲突",即两个事务对同一数据项先后执行写操作,后写者覆盖了先写者。解决这个问题的基本手段是让事务的写操作互斥执行,也就是通过排他锁来保护写操作。

不可重复读与读脏数据

不可重复读是指事务T1在执行过程中两次读取同一数据项,两次读到的值不同。原因是在T1两次读取之间,事务T2修改了该数据项并提交。T1第一次读到的是一个值,第二次读到了另一个值,事务内部的一致性感知被打破。例如,T1先查询账户A余额为1000,T2随即取出500并提交,T1再次查询时发现余额变成了500。事务T1两次读取的结果不一致,可能导致后续计算基于错误的中间值。

读脏数据则更为严重。事务T1修改了某数据项但尚未提交,此时事务T2读取了这个被修改的值。随后T1由于某种原因回滚,撤销了修改,但T2已经读到了那个从未正式存在过的数据值。读脏数据的危害在于,T2基于一个不存在的数据状态做了决策,连锁引发更严重的逻辑错误。

这三种并发问题的本质,都是事务的隔离性被破坏。从数据库理论的角度,并发调度的正确性标准是"可串行化"——多个事务并发执行的结果,等价于它们按某种顺序串行执行的结果。封锁机制正是实现可串行化调度的核心手段。

二、封锁:并发控制的基础武器

封锁是数据库管理系统实现并发控制的最基本技术。其核心思想是:事务在对数据项操作之前,必须先获得对该数据项的锁;操作完成后释放锁。锁的存在使得其他事务的操作受到限制,从而避免并发冲突。

封锁的基本单位是数据项,可以是单个元组、一个数据页、一张表甚至整个数据库。封锁粒度越细,并发度越高,但系统管理锁的开销也越大;粒度越粗,管理开销越小,但并发度降低。数据库系统工程师考试中,封锁粒度的考查通常与索引、物理存储结合出现,典型如"在关系R上建立聚簇索引后,封锁粒度会如何变化"。

共享锁与排他锁的本质区别

数据库系统中的锁分为两种基本类型:共享锁和排他锁。共享锁又称为读锁,事务对数据项加了共享锁后,可以读取该数据项但不能修改;其他事务也可以同时对该数据项加共享锁进行读取,但不能加排他锁。排他锁又称为写锁,事务对数据项加了排他锁后,既可以读取也可以修改该数据项;在排他锁释放之前,任何其他事务都不能对该数据项加任何类型的锁。

这两种锁的相容性规则非常直观:共享锁与共享锁相容,共享锁与排他锁不相容,排他锁与任何锁都不相容。这个规则直接决定了事务的并发执行能否继续进行。当一个事务请求的锁与已有锁不相容时,该事务必须等待,直到不相容的锁被释放。

封锁需要配套两个基本操作:加锁和解锁。在数据库理论的表述中,通常用LOCK-S表示加共享锁,用LOCK-X表示加排他锁,用UNLOCK表示释放锁。事务在执行过程中,由数据库管理系统的锁管理器统一调度锁的分配和释放,锁管理器维护一个锁表,记录每个数据项上当前持有的锁以及等待队列。当一个事务请求的锁因为不相容而被阻塞时,锁管理器将该事务放入等待队列,当事务释放锁后,锁管理器从等待队列中按照先来先服务或优先级策略唤醒下一个事务。这种调度机制是封锁协议能够正确运作的底层支撑。

三、三级封锁协议:逐级加固的防线

三级封锁协议是在基本锁操作之上定义的三套规则,每一级协议解决一类并发问题。值得注意的是,三级封锁协议本身并不是三种孤立的方案,而是递进的——二级包含了二级的规则,二级包含了一级的规则。换句话说,三级封锁协议是层层叠加的防御体系。

第一级封锁协议规定:事务在修改数据项之前,必须先对该数据项加排他锁,直到事务结束时才释放。如果只是读取数据,则不需要加锁。第一级封锁协议的意义在于解决丢失修改问题。当事务要写数据时先加排他锁,其他事务就无法同时进行写操作,从而避免了写-写冲突。但在第一级协议下,读操作不加锁,因此事务在两次读取之间可能读到不同的值,不可重复读和读脏数据仍会发生。软考命题中经常设置的陷阱是:"一级封锁协议可以防止丢失修改和读脏数据",这是错误的——一级协议只防丢失修改。

第二级封锁协议在第一级基础上增加了一条规则:事务在读取数据项之前,必须先对该数据项加共享锁,读取完毕后立即释放共享锁。第二级协议的改进在于防止了读脏数据——因为当T1修改数据时持有排他锁,T2无法加共享锁进行读取,直到T1提交并释放排他锁后T2才能读取。但第二级协议仍然无法防止不可重复读。原因是共享锁在读取后立即释放,T2可以在T1两次读取的间隙修改数据。命题陷阱常出在"二级封锁协议可以保证可重复读"——这是错误的。

第三级封锁协议在第二级基础上进一步修改了共享锁的释放时机:事务在读取数据项之前加共享锁,但共享锁不再读取后立即释放,而是保持到事务结束时才释放。这样一来,T1在事务执行期间始终持有共享锁,T2无法在T1提交之前获得排他锁来修改数据,不可重复读问题被消除。第三级封锁协议是最高级别,同时解决了丢失修改、读脏数据和不可重复读三个问题。

需要特别指出的是,三级封锁协议只解决了三种基本不一致问题,但并不能保证并发调度的可串行化。即使遵守了第三级封锁协议,仍可能出现事务交错执行导致的不一致,如幻读问题——另一个事务插入了新的数据行,导致范围查询前后结果不一致。幻读是更高层级的问题,需要通过间隙锁或表级锁来解决,这已超出三级封锁协议的覆盖范围。

四、两段锁协议:可串行化的保证

两段锁协议是保证并发调度可串行化的经典协议,也是软考数据库科目每年的高频考点。两段锁协议的核心要求是:每个事务必须将所有的加锁操作放在所有的解锁操作之前。换句话说,事务分为两个阶段:第一阶段是扩张阶段,只加锁不解锁;第二阶段是收缩阶段,只解锁不加锁。

两段锁协议的英文缩写为2PL(Two-Phase Locking)。只要所有事务都遵守两段锁协议,它们之间的任何并发调度一定是可串行化的。这是一个非常重要的结论,几乎是软考选择题中的必考知识点。但反过来并不成立——可串行化的调度不一定要求事务遵守两段锁协议。这个"充分非必要"的逻辑关系是命题人的经典陷阱,考生需要牢记。

两段锁协议与三级封锁协议的关系也常被混淆。三级封锁协议规定了加锁的时机

本篇完!

本文为付费内容,请输入 VIP 码查解锁本站全部文章!
点击此处获得 VIP 码
你可能也喜欢这些文章
 

《论云上自动化运维及其应用》适合写什么项目?
08-26
架构师考试质量属性怎么学?六大属性战术一篇打通,软考高频考点全梳理
06-25
软考论文《论软件需求管理》精选试读
08-20
《信息系统项目的资源管理》核心知识点
11-23
嵌入式中断向量表与ISR执行全流程揭秘
07-28
软考高级系统架构师必考:EAI企业应用集成四层模型到底怎么区分?别再死记硬背了
06-29
软考论文《论数据访问层设计技术及其应用》精选试读
12-06
已经确定了,软考从本次考试开始将启用AI辅助阅卷!
12-05
《论信息系统项目的合同管理》论文写作思路
12-27
Kerberos网络认证协议TGT与会话密钥深度辨析
07-10
《论无服务器架构及其应用》适合写什么项目?
09-27
软考真题25年11月系统架构设计师论文考试真题
11-16
系统架构设计师必考:软件体系结构演化分类原则与常见命题陷阱全解析
07-08
《论软件系统架构风格》适合写什么项目?
09-07
《论单元测试方法及应用》考点详解?
01-27
《论信息系统项目的沟通管理》核心知识点
11-09
热门标签
扫码获取 VIP 码
添加管理员微信获取 VIP 码
微信二维码