iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Oracle的死锁分析
  • 471
分享到

Oracle的死锁分析

2024-04-02 19:04:59 471人浏览 薄情痞子
摘要

这篇文章主要介绍“oracle的死锁分析”,在日常操作中,相信很多人在Oracle的死锁分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Oracle的死锁分析”的疑惑有所帮

这篇文章主要介绍“oracle的死分析”,在日常操作中,相信很多人在Oracle的死锁分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Oracle的死锁分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

问题背景描述:

发生死锁的多个进程执行的都是同一个存储过程,大概代码及顺序如下:

--1.首先通过主键order_no锁住一条订单
select t.* from order t where t.order_no='order_no' for update; 
--2.其次通过主键channel_id锁住一个渠道
select t.* from channel t where t.channel_id='channel_id' for update; 
--3.然后通过主键order_no对订单表数据进行修改
update order t set t.order_status=0,t.finish_time=sysdate where t.order_no='order_no';
commit;

死锁情况描述

--正在执行语句3,他处于enq: TX - allocate ITL entry等待
update order t set t.order_status=0,t.finish_time=sysdate where t.order_no='orderno_a';
  • session B

--正在执行语句2,他处于enq: TX - row lock contention等待
select t.* from channel t where t.channel_id='ch2' for update;
  • session C

--正在执行语句2,他处于enq: TX - row lock contention等待
select t.* from channel t where t.channel_id='ch2' for update;

可能还会有更多的session处于执行语句2,并等待enq: TX - row lock contention的情况,这里暂时只列3个session,其实2个也够了,也能形成,只是概率很低。

  • 等待链
    A被C堵塞,C被B堵塞,B被A堵塞

  • 等待链分析:
    A执行到语句3了,说明主键为orderno_a的order数据行锁和ch2的channel数据行锁已经获取到了,而其余的B和C只能等待该ch2数据的行锁释放。
    B和C都执行到语句2了,说明他们都获取到了各自的order数据行锁,且数据不是orderno_a所代表的数据。这点毋庸置疑。

疑问:A,B,C操作的都是不同的订单数据行,且都获取到了各自的行锁的,为什么在表order上,还会发生A被C堵塞呢。

要知道为什么有这个疑问,就要先明白,在A执行order的for update时是已经获取了itl资源的,所以在后来真正update数据时是不应该存在这个等待的enq: TX - allocate ITL entry,因为他已经获取这个资源了。

死锁分析

要分析这个死锁就要明白等待事件enq: TX - allocate ITL entry所代表的资源itl事务槽的含义。itl事务槽是数据块头中用来标记事务的记录。在这里有个重点是数据块。想一想,如果事务跨数据块了会怎样。这就是这个死锁的关键点。当然不同表的事务肯定跨数据块了,一个事务即使修改一个表的多条数据也可能跨块了。这里的情况是,order表上事务都是通过主键来操作的,对于一条数据,要跨越数据块,行迁移或者行连接会有这种情况。

  • 行迁移一般是update后经常出现,比如一个err_mesg字段,初期只有10个字符,后面update为1000个字符,如果这个时候原数据块装不下了,他就会找另外的数据块来存放,而原数据块上放一个新数据块的dba(data block address),指向新的数据块,如下图:



    Oracle的死锁分析

  • 行连接一般是insert时出现的,比如一条数据非常大,大到一个块装不下了,oracle会拆分成多个块来存放。可以通过创建块尺寸小的表空间来测试

到此处,要明白itl是数据块上的资源,即使是同一个事务中,如果事务跨数据块了,当他要修改这个数据块时,他也需要重新再次在这个新块上申请itl资源,也就是我这里死锁中,假设orderno_a数据rowid指向的块为dba_1,行迁移中指向的块为dba_2,在最开始for update时获取的是块dba_1中的itl资源,当最后真正update数据时,为了保护操作,需要获取dba_2上的itl资源。而此时,其余的很多session,比如B,C......N 等等session将块dba_2上的itl资源耗尽了,那么session A就处于等待数据块dba_2上的itl资源的状态,对应于enq: TX - allocate ITL entry。而其他session将等待session A释放渠道表数据的锁。完成了锁的闭环

到此死锁分析完毕。

可以使用以下代码来做简单的测试

--创建order表,将PCTFREE置为0,INITRANS置为1create table t_order(mesg varchar2(4000)) PCTFREE 0 INITRANS 1;
--创建channel表
create table t_channel(id NUMBER);
--准备数据,对于order表,至少要有两个块有数据
--第一个块的数据,有三条,即a,b,c
insert into t_order select rpad('a',3000,'a') from dual;
insert into t_itl select rpad('b',1000,'b') from dual;
insert into t_order select rpad('c',3000,'c') from dual;
--更改数据b,此时第一个块装不下,将会发生行迁移
update t_order set mesg=(select rpad('b',3000,'b') from dual) where mesg like 'b%';
--可以使用以下语句分析行迁移的表,只用作测试,在线生产慎用,可以dump第一个数据块找到,迁移到哪一个dba去了
create table CHaiNED_ROWS (
  owner_name         varchar2(30),
  table_name         varchar2(30),
  cluster_name       varchar2(30),
  partition_name     varchar2(30),
  subpartition_name  varchar2(30),
  head_rowid         rowid,
  analyze_timestamp  date
);
analyze table t_order list chained rows;
select * from CHAINED_ROWS;
--继续插入数据,将迁移后的数据块数据增加,方便之后for update时消耗这个块的itl资源
--通常情况,下面插入的数据就是放在b数据迁移后的数据块的
insert into t_order select rpad('d',1000,'d') from dual;
insert into t_order select rpad('f',6000,'f') from dual;
insert into t_order select rpad('g',300,'g') from dual;
insert into t_order select rpad('h',100,'h') from dual;

--t1时刻
  --session A 
    select * from t_order where mesg like 'b%' for update;
    select * from  t_channel where id=1 for update;
 --t2时刻
  --session B
    select * from t_order where mesg like 'd%' for update;
    select * from  t_channel where id=1 for update;--等待session A 释放
  --其余session
    select * from t_order where mesg like 'f%' for update;
    select * from  t_channel where id=1 for update;--加入该条数据的行锁等待
    select * from t_order where mesg like 'g%' for update;
    select * from  t_channel where id=1 for update;--加入该条数据的行锁等待
    .....
/*如果这些数据不在b所在的块,可以通过设置where条件为以下内容来指定更改b迁移后的块
where DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) = 'block_no' 
    and DBMS_ROWID.ROWID_ROW_NUMBER(ROWID) = 1;
--此时session B与其余session将t_order的第二个块,即d,f,g,h数据所在的块的itl耗尽
--t3时刻
  --session A 去更改t_order的数据
    update t_order t set t.mesg='bbbbb' where t.mesg like 'b%';
  --此时会等待session B及其他session释放itl资源,而session B及其他session又在等待session A释放channel的锁
  --形成了互相等待,闭环,死锁形成

到此,关于“Oracle的死锁分析”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

您可能感兴趣的文档:

--结束END--

本文标题: Oracle的死锁分析

本文链接: https://www.lsjlt.com/news/64065.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Oracle的死锁分析
    这篇文章主要介绍“Oracle的死锁分析”,在日常操作中,相信很多人在Oracle的死锁分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Oracle的死锁分析”的疑惑有所帮...
    99+
    2024-04-02
  • MySQL死锁分析
    本篇内容介绍了“MySQL死锁分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!RC 隔离级别很少出GAP...
    99+
    2024-04-02
  • MySQL死锁举例分析
    这篇文章主要介绍“MySQL死锁举例分析”,在日常操作中,相信很多人在MySQL死锁举例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL死锁举例分析”的疑惑有所帮...
    99+
    2024-04-02
  • Linux死锁实例分析
    这篇“Linux死锁实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Linux死锁实例分析”文章吧。死锁简介进程(线程...
    99+
    2023-06-28
  • Mysql死锁排查实例分析
    这篇文章主要介绍“Mysql死锁排查实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Mysql死锁排查实例分析”文章能帮助大家解决问题。   问题初现  ...
    99+
    2024-04-02
  • java并发编程死锁定义及避免死锁案例分析
    这篇文章主要介绍“java并发编程死锁定义及避免死锁案例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“java并发编程死锁定义及避免死锁案例分析”文章能帮助大家解决问题。场景模拟分析场景一:狭路...
    99+
    2023-06-29
  • sql server中死锁排查的示例分析
    这篇文章主要介绍sql server中死锁排查的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!死锁的四个必要条件:互斥条件(Mutual exclusion):资源不能被共享...
    99+
    2024-04-02
  • 如何进行Sqlserver死锁问题的分析
    本篇文章为大家展示了如何进行Sqlserver死锁问题的分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 问题展现:sqlserve...
    99+
    2024-04-02
  • INSERT语句引发的死锁实例分析
    这篇文章主要介绍“INSERT语句引发的死锁实例分析”,在日常操作中,相信很多人在INSERT语句引发的死锁实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”INSERT...
    99+
    2024-04-02
  • Java多线程之死锁的示例分析
    小编给大家分享一下Java多线程之死锁的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!什么是死锁死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全...
    99+
    2023-05-30
    java
  • MySQL 优化 index merge引起的死锁分析
    目录背景死锁日志表结构执行计划为什么会用 index_merge(索引合并)解决方案一、从代码层面二、从MySQL层面背景 生产环境出现死锁流水,通过查看死锁日志,看到造成死锁的是两...
    99+
    2024-04-02
  • 关于MySQL死锁问题的深入分析
    前言 如果我们的业务处在一个非常初级的阶段,并发程度比较低,那么我们可以几年都遇不到一次死锁问题的发生,反之,我们业务的并发程度非常高,那么时不时爆出的死锁问题肯定让我们非常挠头。不过在死锁问题发生时,很多...
    99+
    2024-04-02
  • MySQL中死锁与日志的示例分析
    这篇文章将为大家详细讲解有关MySQL中死锁与日志的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。最近线上 MySQL 接连发生了几起数据异常,都是在凌晨爆发,由...
    99+
    2024-04-02
  • python多线程中互斥锁与死锁的示例分析
    小编给大家分享一下python多线程中互斥锁与死锁的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、多线程间的资源竞争以下列task1(),task2()两个函数为例,分别将对全局变量num加一重复一千万次循环(...
    99+
    2023-06-29
  • Go并发编程之死锁与活锁的案例分析
    目录什么是死锁、活锁发生死锁的案例分析发生活锁的案例分析什么是死锁、活锁 什么是死锁:就是在并发程序中,两个或多个线程彼此等待对方完成操作,从而导致它们都被阻塞,并无限期地等待对方完...
    99+
    2023-05-18
    Go死锁 活锁分析 Go 死锁 活锁 Go死锁 Go活锁
  • 一个mysql死锁场景实例分析
    前言 最近遇到一个mysql在RR级别下的死锁问题,感觉有点意思,研究了一下,做个记录。 涉及知识点:共享锁、排他锁、意向锁、间隙锁、插入意向锁、锁等待队列 场景 隔离级别:Repeatable-Rea...
    99+
    2024-04-02
  • MySQL产生死锁原因分析讲解
    目录锁类型介绍死锁产生原因和示例1、产生原因2、产生示例案例一案例二案例三案例四案例五案例六锁类型介绍 MySQL 有三种锁的级别:页级、表级、行级 1 表级锁:开销小,加锁快;不...
    99+
    2022-12-16
    MySQL产生死锁原因 MySQL死锁 MySQL死锁处理
  • MySQL死锁问题的分析及解决方法
    这篇文章主要讲解了“MySQL死锁问题的分析及解决方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL死锁问题的分析及解决方法”吧!MySQL死锁问...
    99+
    2024-04-02
  • Linux系统分析死锁的方法是什么
    这篇文章主要介绍“Linux系统分析死锁的方法是什么”,在日常操作中,相信很多人在Linux系统分析死锁的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux系统分析死锁的方法是什么”的疑惑有所...
    99+
    2023-06-28
  • Oracle查询死锁和杀死会话的命令
    这篇文章主要介绍“Oracle查询死锁和杀死会话的命令”,在日常操作中,相信很多人在Oracle查询死锁和杀死会话的命令问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Orac...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作