前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >由于外键约束问题导致ORA-00060错误,报Single resource deadlock

由于外键约束问题导致ORA-00060错误,报Single resource deadlock

原创
作者头像
PHP开发工程师
修改2021-05-14 14:44:26
4940
修改2021-05-14 14:44:26
举报
文章被收录于专栏:thinkphp+vue

由于外键约束问题导致ORA-00060错误,报Single resource deadlock [TM]处理过程

这个问题持续很久,当时看到global_enqueue_deadlock,没有多看,直接认为是全局死锁,需要业务自己协调,从trace文件中拿来一个delete的SQL

但是后来偶然机会让辅助监控的工程师负责再看看该问题,确发现是另一回事。

当时的trace文件内容如下

死锁描述:

Single resource deadlock: blocking enqueue which blocks itself, f 0

资源名称:

----------resource 0xa0732f80----------------------

resname : [0x84584][0x0],[TM][ext 0x0,0x0][domid 0x0]

也就是在资源0x84584上有死锁发生,0x84584对应十进制是542084,对应的对象名称是test2_abc。

从TRACE文件中可以看到正在执行的语句如下:

delete from user123.test2 where ID_=:1

经过进一步确认二者关系,表test2_abc的外键引用了表test2的主键,但是外键没有索引

表定义如下

CREATE TABLE "user123"."test2_abc"

( "ID_" NUMBER(19,0) NOT NULL ENABLE,

"TASK_ID_" NUMBER(19,0) NOT NULL ENABLE,

"USER_" VARCHAR2(60 CHAR),

"USER_NAME_" VARCHAR2(60 CHAR),

PRIMARY KEY ("ID_")

USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS

STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645

PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1

BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)

TABLESPACE "user123" ENABLE,

CONSTRAINT "FK_MAYFQQCA51WHMHQQ1MDLP8QG6" FOREIGN KEY ("TASK_ID_")

REFERENCES "user123"."test2" ("ID_") ENABLE

) SEGMENT CREATION IMMEDIATE

PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255

NOCOMPRESS LOGGING

STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645

PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1

BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)

TABLESPACE "user123"

TASK_ID_字段是外键字段引用了表test2的ID_字段。

表上索引列情况如下:

select index_owner,index_name,column_name,column_position from dba_ind_columns where table_name='test2_abc' and table_owner='user123';

输出内容如下:

INDEX_OWNER

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

INDEX_NAME

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

COLUMN_NAME

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

COLUMN_POSITION

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

user123

SYS_C00428263

ID_

表上只有一个索引SYS_C00428263在ID_列上,在task_id_无索引

解决方案:在外键创建索引,其实Oracle建议在所有外键上都要创建索引,以避免性能问题。参考MOS文档473124.1

来自 “ 开源世界 ” ,链接:http://ym.baisou.ltd/?id=512,如需转载,请注明出处,否则将追究法律责任。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档