通常情况下,dead lock是由应用的不合理造成,应该由PD解决,而非DBA。
但何时为非通常情况呢?
    今天遇到一个case,即为非通常情况。
而他的通常的标志即为:在trc文件里的deadlock graph里,看见有SX/SSX的TM lock出现,而不全是X mode的TX lock。
而这,常常是因为foreign key没有index。(相信很多人都已经有这个经验了)
    但我今天遇到的更加特殊一点的情况是,deadlock graph里,一个session等在SSX mode TM lock上,另一个等在X mode TX lock上。
而对于foreign key没有index的情况,我们常常见到的是两个sessions都等在SSX mode TM lock上。

我今天遇到的deadlock graph如下:
Deadlock graph:
                       ---------Blocker(s)--------  ---------Waiter(s)---------
Resource Name          process session holds waits  process session holds waits
TM-000298c4-00000000       143    3185    SX            149    3061    SX   SSX
TX-000a0000-0006b43c       149    3061     X            143    3185           X

而如果是因为应用的不合理导致的行级别的冲突所产生的deadlock graph为:
                       ---------Blocker(s)--------  ---------Waiter(s)---------
Resource Name          process session holds waits  process session holds waits
TX-00090022-00000079        31    3274     X             29    3267           X
TX-000a0000-000010c0        29    3267     X             31    3274           X

而如果是通常的因为foreign key没有index所产生的deadlock graph常常为:
                       ---------Blocker(s)--------  ---------Waiter(s)---------
Resource Name          process session holds waits  process session holds waits
TM-000047c5-00000000        31    3274    SX   SSX       29    3267    SX   SSX
TM-000047c5-00000000        29    3267    SX   SSX       31    3274    SX   SSX

所以,如果大家看到deadlock graph里有出现等在SSX TM lock上时,最好先看看产生deadlock的两条SQL的表里有没有foreign key的约束,如果有,确认是否在子表上有无index。
    在确认了问题之后,然后带着好奇,可以自己在QA环境做几个实验,模拟出完全一样的deadlock graph。

于是,我根据trc文件后面的信息,发现产生deadlock的两条SQL分别是两条update 父表和子表的update语句。
    通过N多实验,终于模拟出通过两条对父表和子表的update语句产生死锁,并产生那种诡异的deadlock graph的方法了。

直接公布答案:
create table b as select * from a;   
alter table a add constraints apk primary key(object_id);
alter table b add constraint bfk foreign key (object_id) references a (object_id) on delete cascade;

首先b上在object_id列上没有index。
--Session A:
delete from a where object_id=123;

--Session B:
delete from b where object_id=456;

--Session A:
update a set object_id=789 where object_id=789;(-- it will hung here)

--Session B:
update b set object_id=123 where object_id=123; (-- it will hung also, and dead lock happenes)

如上产生的trc文件里即有我遇见的case一模一样的deadlock graph:
                        ---------Blocker(s)--------  ---------Waiter(s)---------
Resource Name          process session holds waits  process session holds waits
TX-000a0018-0000115e        29    3267     X             31    3274           X
TM-000047c5-00000000       31    3274    SX             29    3267    SX   SSX
session 3267: DID 0001-001D-00000024    session 3274: DID 0001-001F-0000000B
session 3274: DID 0001-001F-0000000B    session 3267: DID 0001-001D-00000024
Rows waited on:
Session 3274: obj - rowid = 000047C5 - AAAEfFAAFAAACDXABS
  (dictionary objn - 18373, file - 5, block - 8407, slot - 82)
Session 3267: no row
Information on the OTHER waiting sessions:
Session 3274:
  pid=31 serial=2735 audsid=20123 user: 36/HAOZHU_USER
  O/S info: user: oracle, term: pts/5, ospid: 9809, machine: xxx
            program: xxx[/email] (TNS V1-V3)
  application name: SQL*Plus, hash value=3669949024
  Current SQL Statement:
  update b set object_id=123 where object_id=123
End of information on OTHER waiting sessions.
Current SQL statement for this session:
update a set object_id=789 where object_id=789

如果我们加上index:
    create index bidx on b(object_id);

--Session A:
    delete from a where object_id=123;

--Session B:
    delete from b where object_id=456;

--Session A:
    update a set object_id=789 where object_id=789; (--it will NOT hung, and is successful.)

--Session B:
    update b set object_id=123 where object_id=123; (-- it will hung also, but not dead lock)

那么不会出现deadlock,只会出现一般的lock。

其实,对于这个case,除了foreign key没有index这个问题之外,也不排除应用逻辑的问题。
也有可能在解决了SX/SSX mode TM lock的deadlock之后,应用也会产生X mode TX lock的deadlock也说不定。
毕竟,他也会产生上述比较危险的lock,如果Session A再在object_id=456的行上做dml,也会引发X mode TX deadlock。

综上,deadlock是个挺有趣的东西。

[ 本帖最后由 viadeazhu 于 2010-4-2 21:25 编辑 ]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15415488/viewspace-631260/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/15415488/viewspace-631260/

oracle deadlock with TM lock in SX/SSX mode相关推荐

  1. Oracle Library Cache 的 lock 与 pin 说明

    一. 相关的基本概念 之前整理了一篇blog,讲了Library Cache 的机制,参考: Oracle Library cache 内部机制 说明 http://blog.csdn.net/tia ...

  2. Please use Oracle(R) Java(TM) 11, OpenJDK(TM) 11 to run Neo4j.

    项目场景: 提示:Please use Oracle(R) Java(TM) 11, OpenJDK(TM) 11 to run Neo4j.: Windows系统配置和JDK和Neo4j的时候,容易 ...

  3. oracle锁住用户有什么用,oracle 用户user锁定lock如何知道是什么原因导致的

    问题 数据库用户被锁了,如何查看什么原因导致被锁的呢 结论 1,dba_users是由底层表user$,profile$,profname$相关表构成,当然还有ts$ 2,dba_users与账户锁定 ...

  4. oracle 用户被锁在sga,Oracle 用户user锁定lock如何知道是什么原因导致的

    问题 Oracle数据库用户被锁了,如何查看什么原因导致被锁的呢 结论 1,dba_users是由底层表user$,profile$,profname$相关表构成,当然还有ts$ 2,dba_user ...

  5. oracle怎么deadlock,Oracle Deadlock

    死锁通常发生在主表和子表更新主外键上.更新主表的主键,那么子表的外键会被锁住 如果删除主表的行,那么子表会被锁住. SQL> create table p(x int primary key); ...

  6. oracle中lock的解释

    数据库是一个多用户使用的共享资源.当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性. 加锁是实现数据 ...

  7. ORACLE的TX锁和TM锁及解锁

    数据库是一个并发访问的系统,所以说对一个数据库来说最大的问题就是并发控制的问题,这个并发控制所表现的不是在并发读上面,而是在并发写上面.对应并发写,就需要保证数据的一致性!那么什么是是数据一致性呢? ...

  8. mysql deadlock6_mysql deadlock、Lock wait timeout解决和分析

    项目上线 线上遇到大量的deadlock 和wait timeout 但是看程序没什么问题 问dba也不能给出很好的解决方案!最终自己去了解mysql锁 以及看mysq锁日志 如果了解mysql锁的机 ...

  9. ORACLE锁学习总结

    ORACLE锁机制 http://www.cnblogs.com/gengyulong/archive/2011/04/07/2007586.html 专业名词: 数据库 事务 并发 锁 并发控制 排 ...

  10. oracle之报错:ORA-00054: 资源正忙,要求指定 NOWAIT

    原文出处:http://www.cnblogs.com/Ronger/archive/2011/12/19/2293509.html oracle之报错:ORA-00054: 资源正忙,要求指定 NO ...

最新文章

  1. 办公电脑安装虚拟机基本就绪
  2. MATLAB使用方法和程序设计,实验1 MATLAB使用方法和程序设计
  3. 自学python当黑客-用Python做黑客,暴力破解wifi密码
  4. java怎么跟qtp脚本传参数_QTP多个Action之间传递参数的方法详解
  5. 指定范围内的水仙数(C语言)
  6. CAB无法连接到远程计算机,当您使用远程桌面连接 (RDC) 7.0 连接不正确地更新远程应用程序应用程序中的组合框项...
  7. 体验SRCNN和FSRCNN两种图像超分网络应用
  8. Python使用quote、unquote、urlencode、urldecode对url编码解码
  9. ESD问题案例分析-智能手表为例
  10. 机器人bl虐心_【原创】爱你、无悔(双赛,BL,微虐,含H)
  11. 计算机音乐文爱图片,CG/贺敬轩《文爱》[FLAC/MP3-320K]
  12. 河大计算机学院足球队,“河大杯”我院足球队两连胜提前晋级淘汰赛
  13. 与android虚拟机传输文件,android 在本机和虚拟机设备之间复制文件
  14. 分类效果评价(机器学习)
  15. selenium打开chrome浏览器无痕模式
  16. 二、Unity编辑器开发之ContextMenu
  17. 契约锁android代码,契约锁怎么签合同
  18. 深入理解Java虚拟机(周志明第三版)- 第十二章:Java内存模型与线程
  19. ubuntu18.04安装SecureCRT
  20. 图书云共享图书体验版本1.1.3.3 即将上线 公众号与小程序用户体系流程整合 信息不再孤立

热门文章

  1. Android编程权威指南第三版 第32章
  2. 黑盒测试方法之错误推测法概述
  3. 如何写好博客——常用标点符号易错点正确用法汇总
  4. 中英文常用标点符号统一清洗为英文格式
  5. DSPE-PEG-NHS;磷脂-聚乙二醇-活性脂,可用于基因转染和疫苗传递(科研试剂)
  6. 【计算机组成原理】中央处理器总结——基本知识要点汇总
  7. 海康摄像头4G内网连接方案
  8. 短网址还原 php,php怎么实现短网址还原
  9. javascript学习网站
  10. 九度OJ 1538 GrassLand密码