恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

08-ORA-00060死锁定位

  • 首页
  • 资讯中心
  • /
  • 08-ORA-00060死锁定位

相关资讯

10分钟掌握:免费开源的离线语音识别终极指南 2026/8/2 2:39:42
Apex Legends游戏问题排查:启动、卡顿与连接故障解决方案 2026/8/2 17:57:06
【JAVA课程设计/毕业设计】基于 Agent 模型的智慧校园教学服务系统 智能化知识检索与教学答疑辅助平台【附源码、数据库、万字文档】 2026/8/2 17:57:06

最新资讯

爱奇艺2019秋招大数据开发笔试题B卷解析与备战攻略
视频生成模型选型:低价API与开源本地部署的工程考量
MATLAB传递函数构建与系统互联:从零基础到复杂建模实战
I2C总线BUSY锁死定位与修复:从NACK时序到总线恢复
握住豆包的方向盘:构建可控AI编程助手的工作流
AI伦理治理落地的工程化指南:从API Key到Agent权限与日志审计

今日推荐

云计算SPI三类服务模式是逐层抽象的关系:IaaS提供最底层的硬件资源,PaaS在IaaS基础上封装了开发运行环境,SaaS则进一步封装为可直接使用的软件
最新稳定版(Python 3.14):这是目前官方推荐的最新稳定版本。作为最后一个采用传统“3.x”命名的版本
etc目录下的profile.d文件目录设置环境变量和全局脚本shell

本周热门

Nextcloud 桌面客户端:把同步交给它,你只管改文件
如何将 HTML 转成 Word 文档且格式不丢失?html-to-docx 使用教程
Anki 批量操作卡片完整指南:一次搞定上千张,不再逐张修改

本月精选

如何用DamaiHelper实现演唱会门票的智能自动化抢购:完整技术解决方案指南
第4篇:59 倍性能差距的索引瓶颈定位——一次教科书级的全表扫描调优
终极歌词批量下载神器:5分钟解决离线音乐库歌词同步难题

08-ORA-00060死锁定位

发布时间:2026/8/29 16:54:04
08-ORA-00060死锁定位 ORA-00060死锁——两个会话互相等对方那行社保系统里两个人同时操作同一个参保人的数据是最常见场景。A在修改参保信息B在改缴费记录——两个事务交叉等同一行30秒后Oracle自动杀一个。这篇文章告诉你怎么查到是谁杀了谁、为什么。文章目录ORA-00060死锁——两个会话互相等对方那行一、死锁长什么样二、社保系统的死锁场景三、死锁后怎么查四、预防死锁的编码规范五、unbreakable 死锁——APPLICATION级死锁一、死锁长什么样ORA-00060: deadlock detected while waiting for resourceOracle 自动检测到两个会话互相等待对方持有的锁。解决方式是随机杀掉一个让另一个继续。被杀的那个收到ORA-00060事务回滚。在alert.log里能看到完整的死锁图Deadlock graph: ---------Blocker(s)-------- ---------Waiter(s)--------- Resource Name process session holds waits process session holds waits TX-000b0017-0000041e 129 201 X 96 155 X TX-00090017-000003fb 96 155 X 129 201 X翻译会话201持有TX锁A在等B会话155持有TX锁B在等A。死锁。二、社保系统的死锁场景场景一两个人改同一个人操作员AUPDATE PERSON_INFO SET salary8000 WHERE id_card460027660601003——锁住这一行操作员BUPDATE PAYMENT_HISTORY SET gzze018000 WHERE id_card460027660601003——想锁同一个人等A释放操作员A接着UPDATE PAYMENT_HISTORY SET ylbf01... WHERE id_card460027660601003——想锁B已经锁了的行等B释放死锁 → Oracle杀B根因两个操作员同时操作同一个人的不同表事务太长。场景二外键没有索引-- 删单位时Oracle要检查PERSON_INFO表里有没有这个单位的员工DELETEFROMunit_infoWHEREunit_idA2209;-- 没有索引 → 全表扫描PERSON_INFO → 锁住所有扫描过的行Oracle 在执行外键约束检查时会对子表的相关行加共享锁。如果子表大且外键列没有索引——Oracle会锁住整张表。此时另一个人来更新PERSON_INFO的任意一行——死锁。修法CREATEINDEXidx_jbxx_dwbhONPERSON_INFO(unit_id);三、死锁后怎么查-- 查看alert.log中的最近死锁有完整trace-- 路径$ORACLE_BASE/diag/rdbms/orcl/orcl/trace/alert_orcl.log-- 实时锁等待检查SELECTddl.holding_session,ddl.holding_lock,ddl.waiting_sessionFROMdba_locks ddlWHEREddl.blocking_othersBlocking;-- 查出锁的SQLSELECTs.sid,s.serial#, s.username, s.status, q.sql_textFROMv$sessions,v$sqlqWHEREs.sql_idq.sql_idANDs.sidIN(阻塞的SID列表);杀掉阻塞会话如果业务允许ALTERSYSTEMKILLSESSIONsid,serial#IMMEDIATE;四、预防死锁的编码规范1. 统一加锁顺序// 所有修改单个人数据的接口按这个顺序加锁// 1. PERSON_INFO 2. PAYMENT_HISTORY 3. PERSON_ACCOUNT如果所有人都先锁A再锁B——永远不会交叉。死锁的根本原因是加锁顺序不一致。2. 缩短事务// 坏打开连接→查三张表→算金额→写三张表→COMMIT可能5秒// 好查三张表→算金额→开事务→写三张表→COMMIT事务内1秒3. 外键列必须建索引-- 查哪些外键列没有索引SELECTTABLE_NAME,CONSTRAINT_NAME,COLUMN_NAMEFROMDBA_CONS_COLUMNSWHERECONSTRAINT_NAMEIN(SELECTCONSTRAINT_NAMEFROMDBA_CONSTRAINTSWHERECONSTRAINT_TYPERANDOWNER)ANDNOTEXISTS(SELECT1FROMDBA_IND_COLUMNSWHERETABLE_OWNERANDCOLUMN_NAMEDBA_CONS_COLUMNS.COLUMN_NAME);五、unbreakable 死锁——APPLICATION级死锁还有一种死锁不是Oracle层面的是业务设计造成的。社保系统有一个工作流互斥——一个人不能同时跑两个同类型业务。实现方式是启动业务时在互斥表插入一条记录INSERT INTO hcmutex ...完成时删除。两个操作员同时点发起参保——两条INSERT同时进互斥表——后一条等前一条提交——前一条提交后后一条插入成功——但互斥检查过了——一个人同时跑了两个同类型业务。这不是锁的问题——是互斥检查在业务层的时机不对。修法用SELECT ... FOR UPDATE NOWAIT代替INSERT做互斥。-- 启动业务前先锁住互斥行SELECT1FROMhcmutexWHEREywbmLC01ANDid_card...FORUPDATENOWAIT;-- 如果返回resource busy——该业务已在运行拒绝✅ 亮点死锁debug从alert.log的死锁图出发配合v$session定位SQL补上预防死锁的三条编码规范。扩展方向分布式锁Redis/ZK在Oracle之外的死锁场景、RAC环境下的跨节点死锁。

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号