【问题标题】:ORA-00060: deadlock detected while waiting for resource while executing PLSQL FunctionORA-00060: 在执行 PLSQL 函数时等待资源时检测到死锁
【发布时间】:2016-01-22 13:20:31
【问题描述】:

我尝试在 SQL 中建模继承关系。 Patron 是 Faculty 的父类,这些是它们的定义。

CREATE TABLE Patron(
fname varchar2(25) NOT NULL,
lname varchar2(25) NOT NULL,
id number(10) NOT NULL,
status varchar2(25) NOT NULL,
country_name varchar2(50) NOT NULL,

CONSTRAINT fk_patron_nationality FOREIGN KEY (country_name) REFERENCES Nationality (country_name),
CONSTRAINT pk_patron PRIMARY KEY (id),
CONSTRAINT chk_status CHECK(status IN ('GOOD','BAD'))

);

CREATE TABLE Faculty (
category varchar2(25) NOT NULL,
id number(10) NOT NULL,

CONSTRAINT pk_faculty PRIMARY KEY (id),
CONSTRAINT fk_faculty FOREIGN KEY (id) REFERENCES Patron (id),
CONSTRAINT fk_faculty_category FOREIGN KEY (category) REFERENCES Faculty_Category (category)

);

我使用以下函数调用将数据插入到这些表中。

CREATE or replace FUNCTION insert_faculty (fname in varchar2,lname in varchar2,id in number,
status in varchar2,country_name in varchar2,category in varchar2) return  integer 
is

pragma autonomous_transaction;
begin

insert into patron values (fname,lname,id,status,country_name);
commit;
insert into faculty values (category,id);
commit;

return 1;
end;

执行上述过程有时会出现以下错误。

ORA-00060: deadlock detected while waiting for resource
ORA-06512: at "SMNATARA.INSERT_FACULTY", line 8
00060. 00000 -  "deadlock detected while waiting for resource"
*Cause:    Transactions deadlocked one another while waiting for resources.
*Action:   Look at the trace file to see the transactions and resources
       involved. Retry if necessary.

此错误并不总是发生。这个错误的原因是什么?

【问题讨论】:

  • 你能贴出你调用函数的块吗?
  • 您确实应该“查看跟踪文件以查看所涉及的事务和资源”。每个死锁错误都会生成一个文件,其中包含死锁对象和(通常)创建死锁的查询。没有这些信息,我们只能猜测。
  • 这是我使用的块:select insertFaculty(args...) from dual;
  • “如果自治事务尝试访问主事务持有的资源(在自治例程退出之前无法恢复),则可能发生死锁。”根据您在调用存储过程之前所做的事情,这可能是原因。还将解释“仅偶尔发生”部分。

标签: sql oracle plsql oracle11g oracle-sqldeveloper


【解决方案1】:

我们遇到了类似的问题。事实证明,PRIMARY KEY 更像是带有UNIQUE INDEX 的约束,请参阅http://docs.oracle.com/cd/B28359_01/server.111/b28310/indexes003.htm#i1006566。 所以我们自己创建了索引:

CREATE INDEX noDeadlock1 ON Patron (id);
CREATE INDEX noDeadlock2 ON Faculty (id);

并摆脱了错误消息。

【讨论】:

  • 这对我来说没有意义。我不明白这将如何帮助防止死锁。创建主键会隐式创建索引,为什么索引的创建方式很重要?
  • 它对你没有意义,对我也没有意义。尽管我们有主键,但它对我们有用。其实我想知道为什么文档建议创建一个索引。
  • 如果您不知道它为什么起作用,那么您不应该建议其他人这样做。也许它在您的系统中从未真正起作用,并且由于其他原因问题消失了。你能创建一个测试用例来演示这种行为吗?
  • 我花了一段时间才再次找到这篇文章:oratechinfo.co.uk/deadlocks.html#unindex_fk。我们的 FK 带有一个主键。
猜你喜欢
  • 2011-03-05
  • 2018-04-27
  • 2016-09-02
  • 1970-01-01
  • 2013-09-04
  • 2021-04-20
  • 1970-01-01
  • 2023-03-26
  • 2014-12-23
相关资源
最近更新 更多