首页 > 其他分享 >ORA-60死锁的实验

ORA-60死锁的实验

时间:2023-06-19 14:02:35浏览次数:35  
标签:name 60 死锁 tbl SQL ora id ORA


ORA-60死锁的实验


创建表:


SQL> create table tbl_ora_60 (
      id number(5),
      name varchar2(5)
      );


SQL> insert into tbl_ora_60 values(1, 'a');

1 row created.


SQL> insert into tbl_ora_60 values(2, 'b');

1 row created.


SQL> commit;

Commit complete.


SQL> select * from tbl_ora_60;

        ID NAME

---------- -----

         1 a

         2 b


实验开始

Session1:

SQL> update tbl_ora_60 set name='c' where id=1;

1 row updated.


Session2:

SQL> update tbl_ora_60 set name='d' where id=2;

1 row updated.


Session1:

SQL> update tbl_ora_60 set name='e' where id=2;

hang住


Session2:

SQL> update tbl_ora_60 set name='f' where id=1;

hang住


此时,Session1:

SQL> update tbl_ora_60 set name='e' where id=2;

update tbl_ora_60 set name='e' where id=2

       *

ERROR at line 1:

ORA-00060: deadlock detected while waiting for resource


说明:

Session1                                            Session2

获取id=1的资源锁

                                                        获取id=2的资源锁

等待id=2的资源锁

                                                        等待id=1的资源锁

id=2的SQL报ORA-60,自动rollback


1、因为id=2的资源锁是Session2先获取的,因此Oracle会自动rollback产生死锁时后需要资源锁的SQL,Session1的更新id=2操作被rollback。

2、从中可以发现,真正报ORA-60错误的SQL获取的资源(此例中id=2),并不是触发死锁产生的那个资源(此例中id=1),此例用的是同一个表的不同行,对不同表的相同行也如此,也可以解释之前夜维出现ORA-60时显示的SQL之间表是不同的原因,因为夜维执行的某个表更新与当前应用执行的某个表更新之间存在互锁的情况,因此可能导致夜维SQL报ORA-60或应用报ORA-60的错误。


此时,Session1:

SQL> select * from tbl_ora_60;

        ID NAME

---------- -----

         1 c

         2 b

说明:此处可以证明产生报错后,Oracle自动执行的rollback操作是基于单条SQL,不是整个事务的,所以这里只有id=2的记录被rollback,id=1的执行仍正常。


Session2:

SQL> update tbl_ora_60 set name='f' where id=1;

hang住


继续,Session1:

SQL> commit;

Commit complete.


Session2:

SQL> update tbl_ora_60 set name='f' where id=1;

1 row updated.


Session1:

SQL> select * from tbl_ora_60;

        ID NAME

---------- -----

         1 c

         2 b

只有id=1更新成功。


Session2:

SQL> select * from tbl_ora_60;

        ID NAME

---------- -----

         1 f

         2 d

id=1和id=2都更新成功,但未COMMIT。


SQL> commit;

Commit complete.


Session1:

SQL> select * from tbl_ora_60;

        ID NAME

---------- -----

         1 f

         2 d

因Session2执行COMMIT,提交更新,此处显示与Session执行相同。

标签:name,60,死锁,tbl,SQL,ora,id,ORA
From: https://blog.51cto.com/u_13950417/6512835

相关文章

  • 《Oracle Concept》第三章 - 6
    背景:按照《OracleConecpt》的结构一起了解Oracle数据库,这是学习Oracle从入门到精通的基础。本文主题:第三章《IndexesandIndex-OrganizedTables》-OverviewofIndexes。索引范围扫描索引范围扫描是一种按序扫描索引的方式,具有如下特征:在检索条件中指定了索引中的一个或者更多......
  • 《Oracle Concept》第三章 - 10
    背景:按照《OracleConecpt》的结构一起了解Oracle数据库,这是学习Oracle从入门到精通的基础。本文主题:第三章《IndexesandIndex-OrganizedTables》-OverviewofIndexes。键值压缩技术Oracle能支持使用键值压缩技术对B树索引或者索引组织表中的主键列值部分进行压缩。键值压缩......
  • 《Oracle Concept》第三章 - 8
    背景:按照《OracleConecpt》的结构一起了解Oracle数据库,这是学习Oracle从入门到精通的基础。本文主题:第三章《IndexesandIndex-OrganizedTables》-OverviewofIndexes。反向索引反向索引也是一种B-树类型的索引,和普通B-树索引不同的是,他会在物理层上将每个索引键值的字节逆序......
  • 《Oracle Concept》第三章 - 5
    背景:按照《OracleConecpt》的结构一起了解Oracle数据库,这是学习Oracle从入门到精通的基础。本文主题:第三章《IndexesandIndex-OrganizedTables》-OverviewofIndexes。索引扫描在索引扫描中,数据库会在语句中指定索引列值,遍历索引来提取数据。如果数据库扫描索引,他会消耗N次I......
  • 如何根据v$parameter查询Oracle隐含参数
    Oracle的隐含参数在Oracle的官方文档中是不会出现的,这些参数主要是Oracle内部用于控制某些功能的开关,或者就像今天eygle讲的,Oracle牛逼之处就是可能几年前开发的一个功能就放到当时的版本中,让你“试用”,但你却不知道,如果碰巧因为遇见了这个问题的bug,Oracle会告诉你可以使用这个参数......
  • Oracle的体系结构图万花筒
    虽然现在Oracle的版本频繁更新,但万变不离其宗,学习Oracle最重要的一张图就是Oracle体系结构图,由他延展开来的知识可谓是相当丰富,要是能讲清楚这张图,可以说你和大师很近了。这是来自杨大师公众号的一篇文章,汇总了各版本,Oracle高清体系结构图,《【图示篇】_Oracle10g,11g,12c,18c结构......
  • 非Oracle Linux下安装Oracle 19c
    《Oracle19c之RPM安装》介绍了在OracleLinux平台下安装Oracle19c的过程,其实无论是19c,还是11g,用OracleLinux会为你省不少的事情,毕竟同为Oracle产品,从推广角度看,肯定会相对其他平台提供更多的便利性,例如提前预安装了需要的Package,设置了信号量,创建了各种账号、路径和权限。这次采......
  • OpenJDK和Oracle JDK有什么区别和联系?
    《Linux7安装Oracle11g打怪经历》的安装过程中,启动图形界面,需要指定jre路径,当时使用yuminstalljdk安装的,并不能解决问题,查看版本才知道他是OpenJDK,最终使用OracleJDK,才解决的问题,那OpenJDK和OracleJDK究竟有什么区别?OpenJDKJava最早由SUN公司(SunMicrosystems,发起于美国斯坦......
  • Linux 7安装Oracle 11g打怪经历
    最近接到个需求,要将一套开发环境中Linux6平台的Oracle11g,迁移到两套Linux7平台,原以为很简单,但过程中,确实历经坎坷,就像过山车一般,解决这个问题,又碰到下一个。软件信息RedHatLinux7.5Oracle11.2.0.4坑坑坑1.软链接为了安装路径的标准和简便,可以使用软链接,语法如下,ln-s【目标......
  • 如何找到抛出ORA-00933错误的SQL
    前几天上线,凌晨3点多打车回来的路上,兄弟联系我,提了一个问题,某核心系统,上线的时候,报了很多ORA-00933的错误,明显是应用写的SQL出现了错误导致的,但是因为未将出错的SQL打印到日志中,所以不知道究竟是什么SQL出错了,由于逻辑中涉及到很多的SQL,逐个排查,非常耗时。ORA-00933,意思是“SQLcom......