javaee论坛

普通会员

107198

帖子

0

回复

10

积分

楼主
发表于 2017-07-31 11:18:11 | 查看: 225 | 回复: 0

前段时间工作上碰到了一个很奇怪的死锁问题,一般来说,由业务发出来的SQL是不太可能会产生死锁的,不过确确实实产生了,而且还是ITL死锁!于是借此机会,也把死锁可能出现的情况都分类总结了一下,分享给大家,欢迎探讨交流。

 

先看下大纲:

  1. 死锁的概念及其trace文件

  2. 死锁的分类

  3. 行级死锁的模拟

  4. ITL的概念、ITL结构

  5. ITL引发的死锁处理

  6. ITL死锁的模拟

 

一、死锁的概念及其trace文件

 

1什么是死锁?

 

所谓死锁,是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。Oracle对于“死锁”是要做处理的,而不是不闻不问。

20161027104456236.jpg

 

20161027104506483.jpg

 

2死锁的trace文件

 

Oracle中产生死锁的时候会在alert告警日志文件中记录死锁的相关信息,无论单机还是RAC环境都有Deadlock这个关键词,而且当发生死锁时都会生成一个trace文件,这个文件名在alert文件中都有记载。由于在RAC环境中,是由LMD(Lock Manager Daemon)进程统一管理各个节点之间的锁资源的,所以,RAC环境中trace文件是由LMD进程来生成的。

 

在RAC环境中,告警日志的形式如下所示:

20161027104517274.png

 

在单机环境中,告警日志的形式如下所示:

20161027104548986.jpg

 

通常来讲,对于单机环境,当有死锁发生后,在trace文件中会看到如下的日志信息:

20161027104558138.jpg
图 2-1 单机环境下的死锁

 

当看到trace文件时,需要确认一下产生锁的类型,是两行还是一行,是TX还是TM,如果只有一行那么说明是同一个SESSION,可能是自治事务引起的死锁。

 

对于RAC环境,当有死锁发生后,在trace文件中会看到如下的日志信息:

20161027104611644.jpg
图 2-2 RAC环境下的死锁

 

3死锁的检测时间

 

死锁的监测时间是由隐含参数_lm_dd_interval来控制的,在Oracle 11g中,隐含参数_lm_dd_interval的值默认为10,而在Oracle 10g中该参数默认为60,单位为秒。

20161027104622565.jpg


您的帖子在2017-07-31 11:18:47被admin编辑
超级管理员"admin"于2017-07-31 11:18:58将帖子从“杂七杂八”板块“杂七杂八”主题移动到“数据库知识”板块“oracle”主题
您需要登录后才可以回帖 登录 | 立即注册

技术支持 JAVAEE V2.0 © 2016-2017