Oracle 的 TX、TM、UL 锁对比

Oracle 的 TX、TM、UL 锁对比

Oracle 数据库中的这三种锁机制在并发控制中扮演着不同角色,以下是它们的对比分析:

一、基本特性对比

特性TX (事务锁)TM (DML锁)UL (用户锁)
锁类型行级锁表级锁应用级自定义锁
作用范围保护数据行变更保护表结构不被修改保护用户定义的资源
自动性事务自动获取/释放DML语句自动获取/释放需显式调用DBMS_LOCK获取
可见性其他会话可见其他会话可见仅申请会话可见(默认)
冲突检测通过等待或死锁检测立即冲突报错(ORA-00054)可配置等待或立即失败

二、技术实现对比

1. 数据结构差异

  • TX锁

    -- 在v$lock中的表示
    TYPE='TX', ID1=USN.SLOT, ID2=WRAP#
    -- USN=undo段号,SLOT=槽位号,WRAP=序列号
    
  • TM锁

    TYPE='TM', ID1=OBJECT_ID, ID2=0
    -- 直接关联数据字典对象ID
    
  • UL锁

    TYPE='UL', ID1=<lock_id>, ID2=0
    -- lock_id由DBMS_LOCK.ALLOCATE_UNIQUE生成
    

2. 锁模式对比

模式TX锁表现TM锁表现UL锁表现
共享(SS)SELECT…FOR UPDATELOCK TABLE IN SHARE MODEDBMS_LOCK.REQUEST(mode=>‘S’)
排他(X)UPDATE/DELETE操作LOCK TABLE IN EXCLUSIVE MODEDBMS_LOCK.REQUEST(mode=>‘X’)
空(N)事务结束释放语句结束释放DBMS_LOCK.RELEASE调用

三、使用场景对比

1. TX锁典型场景

-- 案例1:行级更新冲突
UPDATE employees SET salary=salary*1.1 WHERE emp_id=100;
-- 此时会在emp_id=100的记录上获得TX锁-- 案例2:死锁场景
-- 会话1: UPDATE tableA SET... WHERE id=1;
-- 会话2: UPDATE tableB SET... WHERE id=2;
-- 会话1: UPDATE tableB SET... WHERE id=2; -- 等待
-- 会话2: UPDATE tableA SET... WHERE id=1; -- 死锁检测

2. TM锁典型场景

-- 案例1:防止DDL与DML冲突
-- 会话1: SELECT * FROM orders FOR UPDATE;
-- 会话2: ALTER TABLE orders ADD column new_col NUMBER; -- 等待TM锁-- 案例2:LOCK TABLE显式锁定
LOCK TABLE inventory IN EXCLUSIVE MODE;

3. UL锁典型场景

-- 案例1:应用级资源协调
DECLAREl_lockhandle VARCHAR2(128);l_status NUMBER;
BEGINDBMS_LOCK.ALLOCATE_UNIQUE('APP_CONFIG_LOCK', l_lockhandle);l_status := DBMS_LOCK.REQUEST(l_lockhandle, DBMS_LOCK.X_MODE);IF l_status = 0 THEN-- 执行需要互斥的操作DBMS_LOCK.RELEASE(l_lockhandle);END IF;
END;

四、诊断与问题处理

1. 锁等待分析

-- 查看所有锁等待
SELECT l1.sid holding_sid,l2.sid waiting_sid,l1.type lock_type,CASE l1.typeWHEN 'TX' THEN '行锁/事务锁'WHEN 'TM' THEN '表锁'WHEN 'UL' THEN '用户锁'END lock_desc,s1.username holder,s2.username waiter
FROM v$lock l1, v$lock l2, v$session s1, v$session s2
WHERE l1.block = 1 
AND l2.request > 0
AND l1.id1 = l2.id1
AND l1.id2 = l2.id2
AND l1.sid = s1.sid
AND l2.sid = s2.sid;

2. 特殊问题处理

  • TX锁堆积

    -- 查找长事务
    SELECT s.sid, s.serial#, s.username, s.status,t.start_time, t.used_ublk
    FROM v$transaction t, v$session s
    WHERE t.ses_addr = s.saddr
    ORDER BY t.used_ublk DESC;
    
  • TM锁冲突

    -- 查找被锁定的对象
    SELECT object_name, object_type 
    FROM dba_objects 
    WHERE object_id = (SELECT id1 FROM v$lock WHERE type='TM' AND sid=&sid);
    
  • UL锁泄漏

    -- 检查未释放的用户锁
    SELECT * FROM dba_lock_internal 
    WHERE lock_type = 'UL' 
    AND owner <> 'SYS';
    

五、性能优化建议

  1. TX锁优化

    • 减少事务持续时间
    • 使用SELECT...FOR UPDATE NOWAIT避免等待
    • 适当增加_TRANSACTION_TABLE_SIZE参数
  2. TM锁优化

    • 避免业务高峰期执行DDL
    • 对大表DDL使用ONLINE选项
    • 考虑使用LOCK TABLE IN SHARE MODE替代排他模式
  3. UL锁最佳实践

    • 为锁命名使用前缀(如APPNAME_RESOURCE)
    • 设置超时参数:DBMS_LOCK.REQUEST(..., timeout=>10)
    • 在异常处理中确保锁释放

六、版本差异说明

版本TX锁增强TM锁变化UL锁改进
11g增加TX绑定特性引入ONLINE DDL增加锁超时精确控制
12c支持IN_MEMORY事务支持DDL等待超时增加锁状态持久化选项
19c自适应死锁检测算法减少索引维护的TM锁支持PL/SQL锁监控视图
21c自动锁转换优化分区表DDL锁粒度细化增加全局UL锁命名空间

理解这三种锁的差异,可以帮助DBA更好地诊断并发问题并优化数据库性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/84684.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kruskal-Wallis检验 vs. 多次Wilcoxon检验:多重比较-spss

在补充图6中&#xff0c;对喉镜形态分类、病理类型和病程使用 Wilcoxon秩和检验&#xff08;Mann-Whitney U检验&#xff09; 结合 Bonferroni校正&#xff0c;而非 Kruskal-Wallis检验加Dunn’s检验&#xff0c;原因如下&#xff1a; 1. 方法选择的依据 (1) 变量类型与比较组…

vue3+element-plus el-date-picker日期、年份筛选设置本周、本月、近3年等快捷筛选

一、页面代码&#xff1a; <template> <!-- 日期范围筛选框 --> <el-date-picker v-model"dateRange" value-format"YYYY-MM-DD" type"daterange" range-separator"至" start-placeholder"开始日期" end-…

MySQL 关于用户的权限信息查看

1: 先连接mysql : [rootxx ~]# mysql -u admin -p -h 8.8.8.8 -P 3306 Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 38 Server version: 8.0.41 Source distribution Copyright (c) 2000, 2025, Oracle and/or …

C++ STL stack容器使用详解

一、stack容器概述 stack容器适配器是C标准模板库(STL)中实现后进先出(LIFO)数据结构的重要组件&#xff0c;它通过封装底层容器&#xff08;如deque/vector/list&#xff09;提供栈操作接口。 二、stack核心操作详解 1. 容器构造方式 // 默认使用deque存储元素 stack<i…

科技趋势分析系统 BBC (Big Bang of Computing)

科技趋势分析系统 BBC (Big Bang of Computing) 技术文档 1. 项目概述 BBC (Big Bang of Computing) 是一个基于 arXiv 论文数据的科技趋势分析系统&#xff0c;旨在通过分析海量的学术文献&#xff0c;结合大语言模型&#xff08;LLM&#xff09;进行增强分析&#xff0c;提…

尚硅谷redis7 55-57 redis主从复制之理论简介

55 redis主从复制之理论简介 定义 Redis 主从复制&#xff08;Master-Slave Replication&#xff09;是 Redis 提供的一种数据冗余和高可用机制&#xff0c;可以让一个 Redis 主节点的数据复制到一个或多个从节点&#xff0c;实现读写分离、容灾备份等功能。 主节点&#xff…

CarPropertyService 介绍

目录 1. CarPropertyService 基本介绍 1.1 CarPropertyService 结构图 1.2 CarPropertyService 的定义与实现 1.3 CarPropertyManager 与 CarPropertyService 2. PropertyHalService 与 CarPropertyService 3. CarPropertyService 的重要接口介绍 3.1 CarPropertyServi…

JavaScript 性能优化按层次逐步分析

JavaScript 性能优化实战 &#x1f4a1; 本文数据基于Chrome 136实测验证&#xff0c;涵盖12项核心优化指标&#xff0c;通过20代码案例演示性能提升300%的实战技巧。 一、代码层深度优化 1. 高效数据操作&#xff08;百万级数据处理&#xff09; // 不良实践&#xff1a;频繁…

【东枫科技】基于Docker,Nodejs,GitSite构建一个KB站点

Docker 安装桌面版本&#xff0c;安装Node镜像 运行node镜像 需求 和外部的某个文件夹地址可以绑定端口可以绑定&#xff0c;方便server的访问 docker run -itd --name node-test -v C:/Users/fs/Documents/GitHub:/home/node -p 3000:3000 node进入终端 docker exec -it …

【小白AI教程】大模型知识扫盲通识

目录 一、究竟什么是大模型 二、大模型的两大分支 2.1 在线大模型 2.2 开源大模型 2.3 大模型的应用 利用行业知识重新训练AI大模型 利用行业知识对AI大模型进行微调 利用行业知识建立知识库 三、Reasoning 大模型 3.1 基本概述 3.2 核心概念 3.3 技术实现 3.4 应…

测试 Gemini Pro 2.5

好的&#xff0c;我已经明白了您的需求。您希望&#xff1a; 增大概览消息&#xff08;Toast&#xff09;的尺寸&#xff1a;使其更加醒目。消息持久性&#xff1a;当在用户中心内部切换不同标签页&#xff08;例如从“个人信息”切换到“安全设置”&#xff09;时&#xff0c…

大模型——MCP 深度解析

MCP 深度解析 套用一句关于幺半群的名言:"MCP 是一种开放协议,用于标准化应用程序向 LLM 提供上下文的方式,问题何在?"但即使花数小时阅读 MCP 的定义并实操示例,仍难以清晰把握其具体运作流程:LLM 负责什么?MCP 服务器做什么?MCP 客户端的角色是什么?数据…

使用 scikit-learn 库对乌克兰冲突事件数据集进行多维度分类分析

使用scikit-learn库对乌克兰冲突事件数据集进行多维度分类分析 背景 在现代冲突研究中&#xff0c;对冲突事件进行多维度分析和可视化可以帮助我们更好地理解冲突的模式、趋势和影响因素。本次作业将使用开源冲突数据&#xff0c;构建一个完整的机器学习分类流程&#xff0c;…

工作流 x 深度学习:揭秘蓝耘元生代如何用 ComfyUI 玩转 AI 开发

目录 一、从 “代码噩梦” 到 “积木游戏”&#xff1a;我与工作流的初次碰撞 二、深度学习&#xff1a;复杂而迷人的 “数字迷宫” &#xff08;一&#xff09;深度学习的神秘面纱 &#xff08;二&#xff09;深度学习的发展历程 &#xff08;三&#xff09;深度学习面临…

《软件工程》第 14 章 - 持续集成

在软件工程的开发流程中&#xff0c;持续集成是保障代码质量与开发效率的关键环节。本章将围绕持续集成的各个方面展开详细讲解&#xff0c;结合 Java 代码示例与可视化图表&#xff0c;帮助读者深入理解并实践相关知识。 14.1 持续集成概述 14.1.1 持续集成的相关概念 持续集…

1992-2021年各省工业增加值数据(无缺失)

1992-2021年各省工业增加值数据&#xff08;无缺失&#xff09; 1、时间&#xff1a;1992-2021年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;工业增加值 4、范围&#xff1a;31省 5、缺失情况&#xff1a;无缺失 6、指标说明&#xff1a;工业增加值是…

Android15 Camera Hal设置logLevel控制日志输出

这里说明三个内容 Camera Hal Demo默认使用的也是Android原生日志接口&#xff08;例如&#xff1a;ALOGD, ALOGV&#xff09;&#xff0c;为什么logLevel设置为V级别&#xff0c;但是通过ALOGV打印的日志不输出&#xff0c;不生效Camera Hal Demo在不修改ALOGX接口使用的情况…

C++:设计模式--工厂模式

更多内容&#xff1a;XiaoJ的知识星球 目录 1.简单工厂模式1.1 简单工厂1.2 实现步骤1.3 实现代码1.4 优缺点 2.工厂模式2.1 工厂模式2.2 实现步骤2.3 实现代码2.4 优缺点 3.抽象工厂模式3.1 抽象工厂模式3.2 实现步骤3.3 实现代码3.4 优缺点 1.简单工厂模式 . 1.1 简单工厂 …

【DSP笔记】掌握数字世界的律动:时域离散信号与系统基础

掌握数字世界的律动&#xff1a;时域离散信号与系统基础 想象一下&#xff0c;你用手机拍了一张照片&#xff0c;或者听了一首MP3歌曲。这些图片和声音&#xff0c;原本都是连续变化的模拟信号&#xff0c;但为什么它们能被你的手机存储和处理呢&#xff1f;秘密就在于“数字化…

织梦dedecms上传附件不自动改名的办法

织梦dedecms的系统在上传附件后&#xff0c;会将文件自动改名字&#xff0c;那怎么样才能让附件上传后不自动改名字呢&#xff0c;让附件上传后不自动改名字(中文名的附件将会改成拼音文件名称)&#xff0c;现在说一下方法吧&#xff1a; 我们打开网站目录下include\dialog\se…