[转帖]并发delete导致oracle死锁问题的解决

并发,delete,导致,oracle,死锁,问题,解决 · 浏览次数 : 0

小编点评

**死锁原因:** 在多个批处理线程中删除数据库中数据时,由于**SSX锁**(共享行级排他锁)的限制,两个并发线程可能会等待对方释放锁,导致**死锁**。 **死锁发生的原因:** 1. **外键约束:**由于数据表是主表(parent table),而另一张记录表verification_record表利用外键进行依赖,当删除主表数据时,需要在子表 verification_record 表中查找相关数据。 2. **索引不加索引:**由于外键不加索引,当对主表进行更新或删除操作时,会全表扫描子表,查找外键列的行记录,导致**SSX锁**。 3. **多个批处理线程并发操作:**多个线程获取了相同的外键锁,导致排他锁冲突。 **解决方案:** 1. **索引主表的外键列:**在子表中建立索引可以提高扫描效率,减轻锁存负担。 2. **设置事务隔离级别:**使用事务隔离级别可以确保每个事务拥有独立的锁,避免互相阻塞。 3. **取消外键约束:**由于数据插入操作频繁,取消外键约束可以避免索引创建带来的性能影响。

正文

   项目中有一个批处理任务,用来删除数据库中过期的数据(包括说话人的语音、模型、记录等),当程序被分布式部署后,就会有多个批处理线程同时进行删除,不过不同的线程,会根据元信息表得到不同的说话人信息,从而删除不同的数据,并不存在竞争的问题,但是,当项目使用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锁,但是因为在我们的系统的主业务流程中,数据的插入操作很频繁,建立过多索引会严重影响主业务的效率,于是我们取消了数据库的外键约束,由程序确保数据表的一致性,问题解决。


与[转帖]并发delete导致oracle死锁问题的解决相似的内容:

[转帖]并发delete导致oracle死锁问题的解决

项目中有一个批处理任务,用来删除数据库中过期的数据(包括说话人的语音、模型、记录等),当程序被分布式部署后,就会有多个批处理线程同时进行删除,不过不同的线程,会根据元信息表得到不同的说话人信息,从而删除不同的数据,并不存在竞争的问题,但是,当项目使用oracle数据库在线上运行时,却频繁出现了ORA

[转帖]PostgreSQL的MVCC vs InnoDB的MVCC

任何一个数据库最主要功能之一是可扩展。如果不删除彼此,则尽可能较少锁竞争从而达到这个目的。由于read、write、update、delete是数据库中最主要且频繁进行的操作,所以并发执行这些操作时不被阻塞则显得非常重要。为了达到这种目的,大部分数据库使用多版本并发控制(Multi-Version

[转帖]并发控制- sched_yield 函数

函数说明 函数原型 #include int sched_yield(void); 12 sched_yield的作用是让出处理器,调用时会导致当前线程放弃CPU,进程管理系统会把该线程放到其对应优先级的CPU静态进程队列的尾端,然后一个新的线程会占用CPU。详细说明可以查看ma

[转帖]高并发下丢失更新的解决方案

京东云 ​ 已认证帐号 已关注 1 背景 关键词:并发、丢失更新预收款账户表上有个累计抵扣金额的字段,该字段的含义是统计商家预收款账户上累计用于抵扣结算成功的金额数。更新时机是,账单结算完成时,更新累计抵扣金额=累计抵扣金额+账单金额。 2 问题及现象 发现当账单结算完成时,偶尔会发生累计抵扣金额字

[转帖]java并发-一些系统分析工具

https://segmentfault.com/a/1190000041541631 内存分析 java内存分析一般采用Java jmap dump下系统内存文件,使用 jmat 进行分析。 线程分析 线程栈一般通过 jstack 得到。 cpu分析 火焰图arthas 火焰图做为cpu调试的神器

[转帖]高并发场景下JVM调优实践之路

https://www.jianshu.com/p/f5f5f99e2417 一、背景 2021年2月,收到反馈,视频APP某核心接口高峰期响应慢,影响用户体验。 通过监控发现,接口响应慢主要是P99耗时高引起的,怀疑与该服务的GC有关,该服务典型的一个实例GC表现如下图: image image

[转帖]高并发架构的TCP知识整理

https://zhuanlan.zhihu.com/p/344083588 做为一个有追求的程序员,不能只满足增删改查,我们要对系统全方面无死角掌控。掌握了这些基本的网络知识后,相信一方面日常排错中会事半功倍,另一方面日常架构中不得不考虑的高并发问题,理解了这些底层协议也是会如虎添翼。 本文不会单

[转帖]高并发系统中的尾延迟Tail Latency

开发和运维高并发系统的工程师可能都有过类似经验,明明系统已经调优完毕,该异步的异步,该减少互斥的地方引入无锁,该减少IO的地方更换引擎或者硬件,该调节内核的调节相应参数,然而,如果在系统中引入实时监控,总会有少量响应的延迟高于均值,我们把这些响应称为尾延迟(Tail Latency)。对于大规模分布

[转帖]Nginx 服务并发过10万的Linux内核优化配置

https://www.shuzhiduo.com/A/6pdDejeXzw/ 以下Linux 系统内核优化配置均经在线业务系统测试,服务器运行状态良好,用了一些时间整理,现和大家分享一下,如有那位高人看到配置上有问题,请给与指出! # Controls the use of TCP syncook

[转帖]nginx高并发配置详解

阅读目录 https://www.cnblogs.com/liqiu/p/3152206.html 回到顶部 https://www.cnblogs.com/liqiu/p/3152206.html 1. worker_processes 8; nginx 进程数,建议按照cpu 数目来指定,一般为