请问多线程delete 删除同一条数据,死锁怎么解决

风吹腚腚凉 2018-05-28 01:41:52
除了修改业务逻辑,换成同一个线程还有别的办法么?
如果是mysql可以修改事务的隔离级别,oracle怎么弄呢?
主要写代码的人太菜了,弄那么多屎给我擦,怎么整?
两个线程,两个事务,同时删除同一条记录导致死锁,大家有什么好的解决方案么
...全文
3565 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
minsic78 2018-05-29
  • 打赏
  • 举报
回复
死锁如果不是程序逻辑问题,有两个常见原因:1、外键无索引;2、位图索引
卖水果的net 2018-05-29
  • 打赏
  • 举报
回复
不是加锁解决,而是规避资源竞争; 不让多个会话一起删除数据,让他们分开操作。
风吹腚腚凉 2018-05-29
  • 打赏
  • 举报
回复
引用 10 楼 wmxcn2000 的回复:
delete from IWBTAX t where iaxksq in (select ksq from (select ipdprf as prf,ipdfrm as frm,ipdtkt as tkt,ipdksq as ksq from iwbpdt union select ivtprf as prf,ivtfrm as frm,ivttkt as tkt,ivtksq as ksq from iwbvtk union select irtprf as prf,irtfrm as frm,irttkt as tkt,irtksq as ksq from iwbrtk) where (prf,frm,tkt) in ((:prf,:frm,:tkt))) 这里用了 三个 绑定变量,两个会话提供的值,也是不一样的,并且至少提供了多次值。 会话 1, 提供的 C1, C2, C3 ,会话2 提供 D1, D2, D3 ,两个会话都没的提交。 此时,会话 1 又提供 D1,D2, D3, 会话 2 提供 C1, C2, C3 ; 这时会话就会形成。 一个开发也找不到了吗? 如果找不到,那就不让多个会话一起删除数据。
意思是加锁解决了?
simaqingtian 2018-05-29
  • 打赏
  • 举报
回复
我不知道 删除同一条数据 为什么导致死锁 不过要避免可以啊,比如 设定规则 1.线程必须先请求并获得删除权限才能删除数据 2.同一时刻最多只能分配给一个线程删除权限
游北亮 2018-05-29
  • 打赏
  • 举报
回复
你这个明显不是删一条数据啊,而是范围删除,又没用主键: delete from IWBTAX t where iaxksq in 我之前做过类似的优化是先SELECT出主键,再根据主键删除, 当然最保险的还是串行执行删除
小灰狼W 2018-05-29
  • 打赏
  • 举报
回复
并发高的情况下,应该想办法让锁尽快释放,避免争用 可以看看该delete语句耗时多久,是否存在优化空间,以及该表和其他表是否存在主外键关系
风吹腚腚凉 2018-05-29
  • 打赏
  • 举报
回复
引用 15 楼 wmxcn2000 的回复:
不是加锁解决,而是规避资源竞争; 不让多个会话一起删除数据,让他们分开操作。
那只能在delete 逻辑块加锁了,还有别的办法么?
  • 打赏
  • 举报
回复
逻辑上导致,多个回话同时操作同一条资源,为什么非得在数据库上找方法解决哦。
卖水果的net 2018-05-28
  • 打赏
  • 举报
回复
delete from IWBTAX t where iaxksq in (select ksq from (select ipdprf as prf,ipdfrm as frm,ipdtkt as tkt,ipdksq as ksq from iwbpdt union select ivtprf as prf,ivtfrm as frm,ivttkt as tkt,ivtksq as ksq from iwbvtk union select irtprf as prf,irtfrm as frm,irttkt as tkt,irtksq as ksq from iwbrtk) where (prf,frm,tkt) in ((:prf,:frm,:tkt))) 这里用了 三个 绑定变量,两个会话提供的值,也是不一样的,并且至少提供了多次值。 会话 1, 提供的 C1, C2, C3 ,会话2 提供 D1, D2, D3 ,两个会话都没的提交。 此时,会话 1 又提供 D1,D2, D3, 会话 2 提供 C1, C2, C3 ; 这时会话就会形成。 一个开发也找不到了吗? 如果找不到,那就不让多个会话一起删除数据。
kingkingzhu 2018-05-28
  • 打赏
  • 举报
回复
你的这种情况 我到是没遇到过 但是查了下 大部分都指向表的外键问题 你都查了trace 自己去google下啊
风吹腚腚凉 2018-05-28
  • 打赏
  • 举报
回复
引用 7 楼 kingkingzhu 的回复:
你的delete是走全表扫描 还是索引 另外删除动作是否有主从表外键数据要处理
我知道走索引会导致死锁,现在的问题是我想知道有什么办法解决多线程并发删除同一行的问题。。。 因为删除了很多表里的数据啦,又不能乱删索引啊。 又要并发执行,偶尔会报个错很难受的
kingkingzhu 2018-05-28
  • 打赏
  • 举报
回复
你的delete是走全表扫描 还是索引 另外删除动作是否有主从表外键数据要处理
风吹腚腚凉 2018-05-28
  • 打赏
  • 举报
回复
引用 5 楼 liuzhijian2008x 的回复:
死锁问题一般都是逻辑设计有问题,找出sql让开发修改就好了。 要避免同一时间多个会话同时处理同一批数据了。
开发早删库到跑路啦
liu志坚 2018-05-28
  • 打赏
  • 举报
回复
死锁问题一般都是逻辑设计有问题,找出sql让开发修改就好了。 要避免同一时间多个会话同时处理同一批数据了。
风吹腚腚凉 2018-05-28
  • 打赏
  • 举报
回复
我知道兄弟, *** 2018-03-18 01:25:39.378 DEADLOCK DETECTED ( ORA-00060 ) [Transaction Deadlock] The following deadlock is not an ORACLE error. It is a deadlock due to user error in the design of an application or from issuing incorrect ad-hoc SQL. The following information may aid in determining the deadlock: Deadlock graph: ---------Blocker(s)-------- ---------Waiter(s)--------- Resource Name process session holds waits process session holds waits TX-000f001b-002dc2e3 51 177 X 20 234 S TX-00150001-000ef565 20 234 X 51 177 S session 177: DID 0001-0033-00000B9B session 234: DID 0001-0014-00001985 session 234: DID 0001-0014-00001985 session 177: DID 0001-0033-00000B9B Rows waited on: Session 177: obj - rowid = 00013437 - AAAWIFAGGAADLFQAAA (dictionary objn - 78903, file - 390, block - 831824, slot - 0) Session 234: obj - rowid = 00013437 - AAAWIFAGGAADLcrAAA (dictionary objn - 78903, file - 390, block - 833323, slot - 0) ----- Information for the OTHER waiting sessions ----- Session 234: sid: 234 ser: 39915 audsid: 18424972 user: 85/IPRA flags: (0x100045) USR/- flags_idl: (0x1) BSY/-/-/-/-/- flags2: (0x40009) -/-/INC pid: 20 O/S info: user: oracle, term: UNKNOWN, ospid: 54067284 image: oracle@P740_01_LA client details: O/S info: user: appadm, term: SQ-IPRA-APP-1, ospid: 7388:8008 machine: SQ\SQ-IPRA-APP-1 program: Server.WinUi.Job.exe current SQL: delete from IWBTAX t where iaxksq in (select ksq from (select ipdprf as prf,ipdfrm as frm,ipdtkt as tkt,ipdksq as ksq from iwbpdt union select ivtprf as prf,ivtfrm as frm,ivttkt as tkt,ivtksq as ksq from iwbvtk union select irtprf as prf,irtfrm as frm,irttkt as tkt,irtksq as ksq from iwbrtk) where (prf,frm,tkt) in ((:prf,:frm,:tkt))) ----- End of information for the OTHER waiting sessions ----- Information for THIS session: ----- Current SQL Statement for this session (sql_id=620uuhpsnkb6u) ----- delete from IWBTAX t where iaxksq in (select ksq from (select ipdprf as prf,ipdfrm as frm,ipdtkt as tkt,ipdksq as ksq from iwbpdt union select ivtprf as prf,ivtfrm as frm,ivttkt as tkt,ivtksq as ksq from iwbvtk union select irtprf as prf,irtfrm as frm,irttkt as tkt,irtksq as ksq from iwbrtk) where (prf,frm,tkt) in ((:prf,:frm,:tkt))) 但是这个你怎么解释?
卖水果的net 2018-05-28
  • 打赏
  • 举报
回复
暂挂时间长了,应该是你程序超时了,或者是 session 过期了,不是死锁。 死锁是两个会话,形成了一个相互等待对方释放资源的场景。
风吹腚腚凉 2018-05-28
  • 打赏
  • 举报
回复
引用 1 楼 kingkingzhu 的回复:
oracle的单表单行delete是上行级锁的,多线程删不存在死锁,只会暂挂。
暂挂时间久了就会报个死锁的错误,我知道不是传统意义上的死锁。
kingkingzhu 2018-05-28
  • 打赏
  • 举报
回复
oracle的单表单行delete是上行级锁的,多线程删不存在死锁,只会暂挂。

3,490

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧