广告
返回顶部
首页 > 资讯 > 数据库 >Oracle常见死锁发生的原因以及解决方法
  • 914
分享到

Oracle常见死锁发生的原因以及解决方法

2024-04-02 19:04:59 914人浏览 独家记忆
摘要

一.删除和更新之间引起的死锁 造成死锁的原因就是多个线程或进程对同一个资源的争抢或相互依赖。这里列举一个对同一个资源的争抢造成死锁的实例。 CREATE

一.删除和更新之间引起的死

造成死锁的原因就是多个线程或进程对同一个资源的争抢或相互依赖。这里列举一个对同一个资源的争抢造成死锁的实例。

CREATE   TABLE  testLock(   ID NUMBER, 

test  VARCHAR (100)   ) 

COMMIT   

 

INSERT   INTO  testLock  VALUES (1, 'test1' ); 

INSERT   INTO  testLock  VALUES (2, 'test2' ); 

COMMIT ; 

SELECT  *  FROM  testLock 

     

  1.         ID TEST  

  2. ---------- ----------------------------------   

  3.          1 test1  

  4.          2 test2 

死锁现象的重现:

1. 在sql 窗口 执行:SELECT * FROM testLock FOR UPDATE; -- 加行级锁 并对内容进行修改,不要提交

Oracle常见死锁发生的原因以及解决方法

查询死锁:

select  s.username,l.object_id, l.session_id,s.serial#, s.lockwait,s.status,s.Machine,s.program  from  v$session s,v$locked_object l  where  s.sid = l.session_id;

字段说明:

Username:死锁语句所用的数据库用户;
SID: session identifier, session 标示符,session 是通信双方从开始通信到通信结束期间的一个上下文。
SERIAL#: sid 会重用,但是同一个sid被重用时,serial#会增加,不会重复。
Lockwait:可以通过这个字段查询出当前正在等待的锁的相关信息。
Status:用来判断session状态。Active:正执行SQL语句。Inactive:等待操作。Killed:被标注为删除。
Machine: 死锁语句所在的机器。
Program: 产生死锁的语句主要来自哪个应用程序。

此时有一行在命令在等待操作 Inactive

Oracle常见死锁发生的原因以及解决方法

查看引起死锁的语句:

SQL>   select  sql_text  from  v$sql  where  hash_value  in    ( select  sql_hash_value  from  v$session  where  sid  in   ( select  session_id  from  v$locked_object));  

此时没有死锁的语句。

2.另开一个command窗口,执行:delete from testLock WHERE ID=1;

此时发生死锁(注意此时要另开一个窗口,不然会提示:POST THE CHANGE RECORD TO THE DATABASE. 点yes 后强制commit):

Oracle常见死锁发生的原因以及解决方法

死锁查看:

  1. SQL>   select  s.username,l.object_id, l.session_id,s.serial#, s.lockwait,s.status,s.machine,s.program  from  v$session s,v$locked_object l  where  s.sid = l.session_id;

Oracle常见死锁发生的原因以及解决方法

查看引起死锁的语句:

SQL>   select  sql_text  from  v$sql  where  hash_value  in    ( select  sql_hash_value  from  v$session  where  sid  in   ( select  session_id  from  v$locked_object));  

查出以下语句死锁:

delete   from  testLock  where   ID = 1 

死锁的处理: alter system kill session 'session_id,serial#'; 

alter system kill session '301,16405'; 

再查看一下死锁,会发现已经没有stauts为active的记录了, 发生死锁的语句已经被终止。


二.在外键上没有加索引引起的死锁

 

客户的10.2.0.4 RAC for AIX环境频繁出现ORA-60死锁问题,导致应用程序无法顺利执行。 
经过一系列的诊断,发现最终问题是由于外键上没有建立索引所致,由于程序在主子表上删除数据,缺少索引导致行级锁升级为表级锁,最终导致大量的锁等待和死锁。 
下面通过一个例子简单模拟一下问题: 
SQL> create table t_p (id number primary key, name varchar2(30)); 
Table created. 
SQL> create table t_f (fid number, f_name varchar2(30), foreign key (fid) references t_p); 
Table created. 
SQL> insert into t_p values (1, 'a'); 
1 row created. 
SQL> insert into t_f values (1, 'a'); 
1 row created. 
SQL> insert into t_p values (2, 'b'); 
1 row created. 
SQL> insert into t_f values (2, 'c'); 
1 row created. 
SQL> commit; 
Commit complete. 
SQL> delete t_f where fid = 2; 
1 row deleted. 
这时在会话2同样对子表进行删除: 
SQL2> delete t_f where fid = 1; 
1 row deleted. 
回到会话1执行主表的删除: 
SQL> delete t_p where id = 2; 
会话被锁,回到会话2执行主表的删除: 
SQL2> delete t_p where id = 1; 
会话同样被锁,这时会话1的语句被回滚,出现ORA-60死锁错误: 
delete t_p where id = 2 

ERROR at line 1: 
ORA-00060: deadlock detected while waiting for resource 
SQL> rollback; 
Rollback complete. 
将会话1操作回滚,会话2同样回滚并建立外键列上的索引: 
1 row deleted. 
SQL2> rollback; 
Rollback complete. 
SQL2> create index ind_t_f_fid on t_f(fid); 
Index created. 
重复上面的步骤会话1删除子表记录: 
SQL> delete t_f where fid = 2; 
1 row deleted. 
会话2删除子表记录: 
SQL2> delete t_f where fid = 1; 
1 row deleted. 
会话1删除主表记录: 
SQL> delete t_p where id = 2; 
1 row deleted. 
会话2删除主表记录: 
SQL> delete t_p where id = 1; 
1 row deleted. 
所有的删除操作都可以成功执行,关于两种情况下锁信息的不同这里就不深入分析了,重点就是在外键列上建立索引。 
虽然有一些文章提到过,如果满足某些情况,可以不在外键列上建立的索引,但是我的观点一向是,既然创建了外键,就不要在乎再多一个索引,因为一个索引所增加的代价,与缺失这个索引所带来的问题相比,是微不足道的。


您可能感兴趣的文档:

--结束END--

本文标题: Oracle常见死锁发生的原因以及解决方法

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

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

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

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

下载Word文档
猜你喜欢
  • Oracle常见死锁发生的原因以及解决方法
    一.删除和更新之间引起的死锁 造成死锁的原因就是多个线程或进程对同一个资源的争抢或相互依赖。这里列举一个对同一个资源的争抢造成死锁的实例。 CREATE ...
    99+
    2022-10-18
  • MySQL死锁的产生原因以及解决方案
    数据库和操作系统一样,是一个多用户使用的共享资源。当多个用户并发地存取数据 时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。加锁是实现数据...
    99+
    2022-05-15
    MySQL 死锁 MySQL 死锁解决
  • MySQL死锁的原因及解决方法
    这篇文章主要介绍“MySQL死锁的原因及解决方法”,在日常操作中,相信很多人在MySQL死锁的原因及解决方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL死锁的原因...
    99+
    2022-10-18
  • MySQL死锁产生的原因和解决方法
    前言 最近老顾经常碰到同事说,mysql又死锁了导致业务报错。今天我们就来聊聊死锁以及怎么解决 锁类型 mysql锁级别:页级、表级、行级 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。 行级锁:...
    99+
    2023-08-31
    mysql 数据库 java
  • sql死锁的原因及解决方法是什么
    SQL死锁是指在多个并发事务中,每个事务都在等待其他事务所持有的资源,导致所有事务都无法继续执行的状态。死锁的原因主要有以下几种:1...
    99+
    2023-08-16
    sql
  • java.io.EOFException产生的原因以及解决方法
    01 异常发生场景 使用ObjectInputStream类往文件中传入自定义类student时 ObjectInputStream objectInputStream=null;        ArrayList students=n...
    99+
    2023-09-07
    java
  • mysql出现死锁的原因及解决方案
    本文主要给大家介绍mysql出现死锁的原因及解决方案,文章内容都是笔者用心摘选和编辑的,具有一定的针对性,对大家的参考意义还是比较大的,下面跟笔者一起了解下mysql出现死锁的原因及解决方案吧。mysql都...
    99+
    2022-10-18
  • 电脑常见的死机原因及怎么解决
    这篇文章主要介绍了电脑常见的死机原因及怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇电脑常见的死机原因及怎么解决文章都会有所收获,下面我们一起来看看吧。启动过程中的死机1.开机后计算机系统无任何反应:电...
    99+
    2023-06-27
  • 数据库死锁产生的原因及解决方案有哪些
    数据库死锁产生的原因及解决方案有哪些?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。数据库死锁产生的原因及解决方案:1、程序的B...
    99+
    2022-10-18
  • Win7常见启动故障产生的原因及解决方法整理
      相信绝大多数朋友都用上了Win7系统了吧,Win7系统虽然比以前其他版本的Windows系统都稳定得多,但是由于安装某些特殊软件或误操作,系统还是会出现各种启动故障。接下来,笔者就来给大家分析一下Win7常见启动故障...
    99+
    2023-06-02
    win7 启动故障 解决 原因 故障 整理 方法
  • mysql死锁的原因和解决方法是什么
    这篇文章主要讲解了“mysql死锁的原因和解决方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql死锁的原因和解决方法是什么”吧! ...
    99+
    2022-10-18
  • Oracle用户被锁的原因及解决办法
    在登陆时被告知test用户被锁 1、用dba角色的用户登陆,进行解锁,先设置具体时间格式,以便查看具体时间 SQL> alter session set nls_date_format='yyyy...
    99+
    2022-10-18
  • 详解Java中NullPointerException异常的原因以及解决方法
    NullPointerException是Java中常见的异常之一,通常是在运行时发生的。该异常表示程序试图访问一个空对象的属性或调...
    99+
    2023-08-11
    java
  • 一些常见IIS无法访问PHP的原因及解决方法
    在Windows的Web服务器环境中,IIS是非常常见的Web服务器软件之一。作为一个全面的Web服务器,IIS可以运行各种类型的Web应用程序,包括基于PHP语言编写的应用程序。然而,在实际应用中,有时我们会发现IIS无法访问或运行PHP...
    99+
    2023-05-14
    php iis
  • win7假死机怎么办 win7系统假死机的原因以及解决方法
      电脑安装Windows7系统使用过程中突然出现卡屏的情况,我们叫win7假死机状态。今天小编就为大家分享win7系统假死机解决方法,需要的朋友可以看看   win7假死机解决办法:   首先,最好不要安装各种所谓的...
    99+
    2023-06-13
    win7 假死机 死机 原因 系统
  • 了解Service Unavailable的原因以及解决方法
    一、如果出现“Service Unavailable”的提示,刷新几下又可以访问。出现这种情况是由于您的网站超过了iis限制造成的由于2003的操作系统在提示IIS过多时并非像2000系统提示&l...
    99+
    2023-05-25
    Service Unavailable WINDOWS2003 原因 方法
  • Java中FileNotFoundException异常的常见原因和解决方法
    在Java编程中,FileNotFoundException是一个常见的异常,它表示在尝试访问文件时无法找到指定的文件。本文将介绍FileNotFoundException异常的常见原因,并提供相应的解决方法和示例代码。 文件路径错误:F...
    99+
    2023-12-23
    java 开发语言
  • 常见IIS无法访问PHP的原因及解决方法是什么
    这篇文章主要讲解了“常见IIS无法访问PHP的原因及解决方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“常见IIS无法访问PHP的原因及解决方法是什么”吧!错误的PHP设置如果你的I...
    99+
    2023-07-05
  • 502 Bad Gateway产生的原因以及8种详细的解决方法
    文章目录 1. 复现错误 2. 分析错误 2.1 502系列错误代码 2.2 5XX系列错误代码 3. 产生502错误的原因 4. 解决502错误的方...
    99+
    2023-09-03
    gateway 服务器 后端 运维 运维开发
  • JVM 发生内存溢出的原因以及解决办法是怎样的
    JVM 发生内存溢出的原因以及解决办法是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1. Java 堆空间发生频率:5颗星造成原因无法在 Java 堆中...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作