我有以下两个查询导致死锁。 但是不知道为什么在这种情况下Oracle试图使SSX表锁定。

所有测试样本都试图重现该问题,仅行锁定。

------------Blocker(s)----------- ------------Waiter(s)------------

Resource Name process session holds waits serial process session holds waits serial

TM-000386AF-00000000-00000000-00000000 101 298 SX SSX 65474 27 646 SX SSX 21533

TM-000386AF-00000000-00000000-00000000 27 646 SX SSX 21533 101 298 SX SSX 65474

Query:

DELETE FROM VERSANDPALETTE V WHERE V.ID IN (SELECT COLUMN_VALUE FROM TABLE(:B1 ))

----- Information for the OTHER waiting sessions -----

Session 646:

DELETE FROM VERSANDPALETTE WHERE ID IN (SELECT * FROM TABLE(:B1 )) AND ID NOT IN (SELECT * FROM TABLE(:B2 ))

我希望删除独立的行集,并且不创建表锁。

有人暗示为什么会发生吗?

编辑2 :(问题的简化版本,需要2分钟才能复制)

谢谢你的帮助!

我使用以下代码对其进行了进一步测试:

-- setup

create table p ( x int primary key );

create table c ( x references p );

insert into p select rownum from dual connect by level <= 10;

insert into c select * from p;

commit;

-- 2 session test

-- session 1

update c set x = 2 where x = 1;

-- session 2

update c set x = 4 where x = 3;

delete from p where x = 3;

-- session 1

delete from p where x = 1;

-- deadlock is happening now

-- rollback both sessions

这导致了预期的死锁,因为子表fk上没有索引。 (正如您向我指出的那样)

令我困惑的是,当仅使用一个会话时,只有locked_mode 3 v $ locked_object打开。 某处应该有一个locked_mode 5行。

-- 1 session test

update c set x = 2 where x = 1;

update c set x = 4 where x = 3;

delete from p where x = 3;

delete from p where x = 1;

select

c.owner,

c.object_name,

c.object_type,

b.sid,

b.serial#,

b.status,

b.osuser,

b.machine,

a.locked_mode

from

v$locked_object a ,

v$session b,

dba_objects c

where

b.sid = a.session_id

and

a.object_id = c.object_id;

-- no locked_mode 5 entries...

-- rollback the session

添加索引可以解决该问题:

CREATE INDEX c_index ON c(x);

-- 2 session test

-- session 1

update c set x = 2 where x = 1;

-- session 2

update c set x = 4 where x = 3;

delete from p where x = 3;

-- session 1

delete from p where x = 1;

-- deadlock is not happening :)

所以我猜有一些锁升级在继续吗? 因为单会话测试不会获取相同的表锁。

oracle 12c 死锁 处理,oracle - PLSQL Oracle 12c死锁,为什么需要对SSX Table锁进行独立删除? - 堆栈内存溢出...相关推荐

  1. impdp 不兼容_oracle - Oracle:使用impdp导入数据库转储时出错:Data Pump客户端与数据库版本12.1.0.2.0不兼容 - 堆栈内存溢出...

    我们从Oracle DB v12创建了一个数据库转储. 1使用expdp(导出数据泵)v12.1实用程序,现在我想将其导入另一个DB v12. 1使用impdp(导入数据泵)工具. 对于杂项. 我需要 ...

  2. oracle 生成 json文件,oracle - PLSQL导入JSON并导出为JSON文件 - 堆栈内存溢出

    用于处理json的设置: create table json_from_file (id number, data clob, constraint chk_data_is_json check (d ...

  3. oracle 内存 无法启动数据库,database - 无法启动Oracle数据库(处理系统参数失败) - 堆栈内存溢出...

    我将在Ubuntu 16.04上设置Oracle DB 12c. 我正在遵循本指南 . 但是,当我尝试启动时,失败并显示以下错误: SQL> connect sys as sysdba Ente ...

  4. oracle 延迟段,oracle - 未启用延迟段创建功能(ORA-00439) - 堆栈内存溢出

    我有带有DDL的.sql脚本文件超过60个表. 我正在尝试将脚本复制粘贴到SQL Developer中,连接到"Oracle Database 11g Express Edition Rel ...

  5. oracle绑定变量过多,oracle - 在SQL Plus中使用绑定变量并返回多行? - 堆栈内存溢出...

    这是一个愚蠢的问题,但我似乎无法解决. 我有一个查询在OCI程序中引起麻烦,因此我想在SQL * Plus中手动运行它以检查是否有任何区别. 这是查询: select e.label as doc_n ...

  6. php oracle 无查询结果,php - Oracle Insert查询不起作用,也不会抛出任何错误 - 堆栈内存溢出...

    嗨,我是Oracle的新手. 我试图在PHP中使用oracle将记录插入表中. 但它不起作用,也没有抛出任何错误. 以下是我的代码. 请告诉我我做错了什么. $insertSQL= "INS ...

  7. oracle 异常返回值,oracle - java.sql.SQLException:无效的列类型:调用具有行类型返回值的函数时为1111 - 堆栈内存溢出...

    我在一个名为" MyPackage"的Oracle软件包中有一个函数: FUNCTION MyFunction(name IN VARCHAR2) RETURN MyTable%r ...

  8. oracle ebcdic 转换,sql - oracle ebcdic sqlldr问题 - 堆栈内存溢出

    我有一个关于如何将EBCDIC文件加载到Oracle表中的问题. 我已经阅读了许多有关该问题的主题. 但是,我似乎仍然无法取得进展. 根据COBOL副本给我的定义,我构建了如下控制文件:EBCDIC. ...

  9. oracle 内存错误的是什么意思,java - 是什么导致此JMS错误连接到OracleAQ? - 堆栈内存溢出...

    我从正在侦听OracleAQ的Java服务中收到零星的错误. 它似乎每天晚上都在发生,我不确定发生了什么. 真的是数据库连接问题吗? 还是"出队失败"表明它已连接并且发生了其他事情 ...

  10. oracle 500错误,oracle - FRM-50016法律字符是0-9 - + E错误Oracle表单 - 堆栈内存溢出

    我创建了Oracle Form,其中用户从目标"目标"链接"浏览""CSV"文件,我们将在文本字段项中显示. 用户按下保存按钮后,列值将从& ...

最新文章

  1. php做gui,php7 图形用户界面GUI如何开发
  2. 计算机故障报告怎么写,计算机这样的诊断报告是否正常
  3. html 内部浮动外部不,CSS:外部层高度自适应内部浮动层高度的方法
  4. 如何做一场高质量的分享
  5. Java判断字符串是否相同
  6. php面试专题---2、常量及数据类型考点
  7. php 负载监控_php记录服务器负载、内存、cpu状态的代码
  8. redis结合springboot 无法注入redisTemplate问题
  9. java 合并算法思想_Java实现合并两个有序序列算法示例
  10. 开课吧Java课堂:什么是流?如何运用字节流和字符流?
  11. 另类多线程生产者与消费者模式
  12. js判断时间两小时之内_JS 判断两个时间的大小(可自由选择精确度:天,小时,分钟,秒)...
  13. webstorm中 scss或sass配置自动编译
  14. 怎么用php跨域请求
  15. 天力卓越消息服务器是什么意思,开票版药易通出现RPC服务器不可用是什么问 – 手机爱问...
  16. LibreOffice创建数据透视表
  17. Python str函数
  18. 电脑开机启动选择系统
  19. Qlikview脚本生成日历表
  20. flutter的坑.dart1与dart2写法的区别

热门文章

  1. Python爬取豆瓣电影top250(附全部源码)
  2. 2015第二届上海国际机上内饰与翻新展览会
  3. 机房收费系统心得总结
  4. Photoshop抠头发丝超简单方法 PS抠头发
  5. 电磁循迹小车赛后总结
  6. 用代码写个烟花之基础版
  7. 谷歌浏览器翻译插件 划词翻译
  8. android wifi 获取 getBssiD
  9. 软件测试使用linux做什么?
  10. 免费天气API,全国天气 JSON API接口,可以获取五天的天气预报