Seal^_^头像
Oracle 锁机制详解:行锁、表锁、TX/TM 锁与死锁排查:深入理解数据库并发控制与故障排查封面图

Oracle 锁机制详解:行锁、表锁、TX/TM 锁与死锁排查:深入理解数据库并发控制与故障排查

一、Oracle 锁机制概述


1.1 锁的作用与分类

Oracle 锁机制是数据库并发控制的核心,用于确保数据一致性和完整性。锁分为行锁(Row Lock)、表锁(Table Lock)、TX 锁(事务锁)和 TM 锁(表级锁),分别在不同粒度上管理并发访问。行锁针对单行数据,表锁锁定整个表,TX 锁管理事务状态,TM 锁协调表级操作。


1.2 锁的获取与释放流程

锁的获取遵循“先申请、后使用、最后释放”的原则,Oracle 通过锁管理器(Lock Manager)协调锁的分配。事务开始时,系统为事务分配 TX 锁;当事务需要访问数据时,申请相应粒度的锁(行锁或表锁);操作完成后,释放锁资源。


是

否

事务开始

分配 TX 锁

需要访问数据?

申请行锁/表锁

事务结束

执行操作

释放锁资源


该流程图展示了事务从开始到结束的锁获取与释放过程,其中 TX 锁作为事务标识,行锁/表锁根据数据访问粒度动态申请。


二、行锁详解


2.1 行锁的原理与类型

行锁是 Oracle 最细粒度的锁,仅锁定被修改的行,减少锁冲突。行锁分为共享锁(Shared Lock, S)和排他锁(Exclusive Lock, X)。共享锁允许多个事务读取同一行,排他锁阻止其他事务修改或读取该行。


2.2 行锁获取的时序图

当两个事务同时请求同一行时,行锁的获取过程如下:


数据库事务B事务A数据库事务B事务A请求共享锁(S)授予共享锁请求排他锁(X)阻塞(等待事务A释放锁)释放共享锁授予排他锁执行操作释放排他锁


该时序图显示,事务A先获取共享锁,事务B请求排他锁时被阻塞,直到事务A释放锁后,事务B才获得排他锁。


三、表锁详解


3.1 表锁的原理与类型

表锁是 Oracle 较粗粒度的锁,锁定整个表,适用于大批量数据操作(如全表更新)。表锁分为共享表锁(Share Table Lock, S)和排他表锁(Exclusive Table Lock, X)。共享表锁允许多个事务读取表,排他表锁阻止其他事务读写表。


3.2 表锁获取的流程图

表锁的获取流程需检查表是否已被其他事务锁定,避免冲突:


无冲突

有共享锁

有排他锁

事务请求表锁

检查表锁状态

授予表锁

授予共享表锁(兼容)

阻塞(等待排他锁释放)

执行操作

释放表锁


该流程图说明,当表未被锁定时直接授予锁;若存在共享锁,可授予共享表锁;若存在排他锁,则阻塞等待。


四、TX/TM 锁详解


4.1 TX锁与TM锁的关系

TX 锁(事务锁)管理事务的生命周期,记录事务的状态(如活动、提交、回滚);TM 锁(表级锁)协调表级操作的并发控制。TX 锁是事务的标识,TM 锁是表级锁的具体实现,两者通过事务 ID 关联。


4.2 TX/TM锁的类图

TX 锁和 TM 锁的层次结构如下:


管理表级锁

继承基础锁接口

1

*

TX_Lock

+transaction_id: number

+state: string

+acquire_lock(table_id: number, lock_type: string)

+release_lock(table_id: number)

TM_Lock

+table_id: number

+lock_type: string

+is_compatible(other_lock: TM_Lock) : : boolean

Lock


该类图展示 TX 锁通过管理多个 TM 锁实现事务级控制,TM 锁继承基础锁接口,提供兼容性检查方法。


五、死锁排查与处理


5.1 死锁的产生原因

死锁发生在两个或多个事务相互等待对方释放锁时,满足“互斥条件、请求与保持、不剥夺、循环等待”四个条件。例如,事务A持有行锁1并请求行锁2,事务B持有行锁2并请求行锁1,形成循环等待。


5.2 死锁排查的流程图

Oracle 通过 V$LOCK 和 V$SESSION 视图排查死锁,步骤如下:


是

否

查询 V$LOCK 视图

发现等待事件?

分析等待图(循环等待)

结束排查

查询 V$SESSION 获取死锁事务信息

终止死锁事务(KILL SESSION)


该流程图说明,通过查询锁视图发现等待事件,分析等待图确认死锁,然后终止死锁事务。


5.3 死锁检测的时序图

Oracle 定期检测死锁,当发现循环等待时,自动终止其中一个事务:


事务B事务AOracle事务B事务AOracle检测到事务A等待事务B检测到事务B等待事务A发现循环等待终止事务A(回滚)释放事务B的锁继续执行


该时序图显示,Oracle 检测到循环等待后,终止其中一个事务(如事务A),释放其锁资源,使另一个事务(事务B)继续执行。

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/qq_41840843/article/details/166991339

文章来源转载

评论

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--