项目中有一个批处理任务,用来删除数据库中过期的数据(包括说话人的语音、模型、记录等),当程序被分布式部署后,就会有多个批处理线程同时进行删除,不过不同的线程,会根据元信息表得到不同的说话人信息,从而删除不同的数据,并不存在竞争的问题,但是,当项目使用oracle数据库在线上运行时,却频繁出现了ORA-00060: deadlock detected while waiting for resource的错误。在进行错误调试时,打印出了sql语句,发现程序在delete from smb.voice

where id = ?时出现了deadlock,根据打印出的信息,发现并发的线程删除的voice id没有重叠的现象,id为主键,根据id来删除具体的行记录,获取到的应该为行锁,两个并发并发线程不会产生锁竞争,为什么会出现deadlock,非常郁闷。

于是登录oracle数据库去查看trace file,在trace file中发现了deadlock的相关信息,如下:

从上述信息可以看出,两个session都holds SX(行级排他锁),在waits SSX(共享行级排他锁),因为我对SX锁我知道,根据id来删除记录,会产生SX排它锁,正常,不过,它们等待的SSX锁到底是什么?通过查询,我知道SSX同一时间只允许一个事务持有和修改锁定的表,其他事务可以查询但不能修改,也就是说SSX是表级别的锁,这也就是此处deadlock的罪魁祸首,但是为什么会出现表锁喃?又是锁住哪张表的喃?我无法根据上面的信息,看出锁住的是哪张表?就用一些信息进行了google,发现了一个页面上描述的问题的trace

file和我的很像,网站:https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:3932525800346405986,而下面的解决方案中有如下信息:

do you

1) delete from the parent table

2) update the parent table primary key (even if just setting it to itself, many applications do that for some reason)

3) merge into the parent table.

2)、3)的情况我都不存在,但是我要delete的voice表确实是主表(parent table),它被另一张记录表verification_record表所依赖(利用外键进行依赖),于是我开始研究外键与deadlock之间的关系。发现了一个现象:oracle中外键不加索引,当对主表进行操作时,会产生死锁。因为当表之间存在外键约束时,你对主表进行更新或删除操作时,都会去全表扫描子表,找到外键列的行记录,确保数据的一致性,这样就产生了SSX锁,解决的方案为在子表的外键列加索引,这样扫描索引即可,不会全表扫描,也就不会产生SSX锁,但是因为在我们的系统的主业务流程中,数据的插入操作很频繁,建立过多索引会严重影响主业务的效率,于是我们取消了数据库的外键约束,由程序确保数据表的一致性,问题解决。

oracle delete加并发,并发delete导致oracle***锁问题的解决相关推荐

  1. oracle自动加一天,如何将Oracle 当前日期加一天、一分钟

    在Oralce中我发现有add_months函数,加天数N可以用如下方法实现,select sysdate+N from dual sysdate+1 加一天 sysdate+1/24 加1小时 sy ...

  2. 导致oracle 控制文件坏,异常断电导致ORACLE控制文件等受到破坏的处理

    故障现象:客户某台WINDOWS服务器掉电,ORACLE数据库STARTUP提示控制文件CONTROL01.CTL.CONTROL02.CTL被破坏.一.处理控制文件异常故障方法:直接拷贝CONTRO ...

  3. oracle数据库加复合组件,浅谈oracle复合数据类型 (2)

    二.集合 类似C语言中的数组,在ORACLE7.3及以前的版本中只有一种集合称为PL/SQL表,这种类型的集合依然保留,就是索引(INDEX_BY)表. PL/SQL有三种类型的集合a.Index_b ...

  4. oracle字段加约束,添加/删除约束(Oracle)

    增加一列或者多列 alter table 表名 add(column_name datatype[,..]); 修改一列或者多列(修改列的类型或者是长度) alter table 表名 modify( ...

  5. python访问数据库如何解决高并发_使用 Python 和 Oracle 数据库实现高并发性

    随着趋势发展的核心转向更多而不是更快发展,最大限度地提高并发性的重要性日益凸显.并发性使得编程模式发生了新的转变,可以编写异步代码,从而将多个任务分散到一组线程或进程中并行工作.如果您不是编程新手并且 ...

  6. ORACLE EBS 开发 用于并发程序的PL/SQL API

    ORACLE EBS 开发 用于并发程序的PL/SQL API 1.  FND_CONC_GLOBAL包 这个包用于从PL/SQL程序中提交子请求. u  函数FND_CONC_GLOBAL.REQU ...

  7. oracle Plsql 执行update或者delete时卡死问题解决办法

    oracle Plsql 执行update或者delete时卡死问题解决办法 参考文章: (1)oracle Plsql 执行update或者delete时卡死问题解决办法 (2)https://ww ...

  8. 导致Oracle性能抖动的参数提醒

    第一章 技术人生系列 · 我和数据中心的故事(第四期)-导致Oracle性能抖动的参数提醒 中亦安图 | 2016-01-25 21:39 前言 不知不觉,技术人生系列·我和数据中心的故事来到了第四期 ...

  9. 【中亦安图】导致Oracle性能抖动的参数提醒(4)

    第一章 技术人生系列 · 我和数据中心的故事(第四期)-导致Oracle性能抖动的参数提醒 中亦安图 | 2016-01-25 21:39 前言 不知不觉,技术人生系列·我和数据中心的故事来到了第四期 ...

  10. oracle 10g磁盘管理,Oracle 10g UNDO表空间过大导致磁盘空间不足的解决

    在Oracle 10g数据库的应用中,出现了UNDO表空间过大导致磁盘空间不足而崩溃的现象(ORA-30036: unable to extend segment by 8 in undo table ...

最新文章

  1. python map()函数
  2. js-ajax-04
  3. 用mysqlbinlog查看row格式的事件
  4. 【如意影视】运营级+完整类库+解析线路+无限增加或删减解析接口+如意可视化播放器1.1
  5. 前端网页制作-javaScripe 初学笔记
  6. 【Computer Organization笔记25】I/O:程序直接控制,程序中断方式,直接存储访问(DMA),通道控制方式
  7. C#进阶系列——WebApi 路由机制剖析:你准备好了吗?
  8. 分三种情况C语言编程,吴进的256basic.h阅读笔记,请问scanline_copy子程序为什么要分三种情况考虑:(1)d...
  9. 交通灯keil程序加2位数码管_十字路口交通灯控制Keil编写
  10. SQL Server Compact 3.5 SP1 RTM发布了!
  11. jeecg 框架 swagger后台接口文档 隐藏全部内容!!(解决漏洞监测)
  12. 初学者如何快速入门深度学习?
  13. 【论文笔记】Exploring Self-attention for Image Recognition
  14. 波导缝隙天线仿真出现较大副瓣,添加波导端口吸收副瓣
  15. 【Linux】yum(Yellow dog Updater Modified)使用简介
  16. mysql sasl_SASL认证失败的原因(authentication failed)
  17. SVN常用命令集合_艾孜尔江撰
  18. IT农民工如何来美国工作(续)
  19. 宾得rtk手簿说明书_那曲宾得RTK操作说明
  20. Python发送邮件(以QQ邮箱为例)

热门文章

  1. Pytorch 深度学习入门与实践 第二章 pytorch快速入门 (1)
  2. mysql捕获1300的错误_pt-osc 变更时遇到 “MySQL error 1300” 报错问题解决
  3. 话说多球 --  乒在民间
  4. 解决报错ImportError: IProgress not found. Please update jupyter and ipywidgets.
  5. 如何使windows系统环境变量的改变即时生效
  6. 帝国cms 评论 审核 php,帝国CMS自动审核发布脚本
  7. 电脑键盘equals在哪个位置_常用标点符号和电脑键盘符号英语表示 -
  8. 熊猫压缩怎么使用_记录随时间变化的PagerDuty事件(使用熊猫)
  9. JAVA扫码点餐(1)-项目介绍
  10. 用UWP模仿网易云音乐的动画