【发布时间】: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