【发布时间】:2017-03-27 06:20:28
【问题描述】:
我有以下触发器
CREATE OR REPLACE TRIGGER LAST_EDIT
BEFORE UPDATE ON MESSAGES
FOR EACH ROW
DECLARE
pragma autonomous_transaction;
BEGIN
if :NEW.TEXT <> :OLD.TEXT THEN
UPDATE MESSAGES set MESSAGES.LAST_EDITED=(select USERS.EMAIL from USERS inner join LAST_EDITED_TABLE on users.ID=LAST_EDITED_TABLE.USER_ID where
LAST_EDITED_TABLE.MESSAGE_ID=(select MESSAGE_ID from LAST_EDITED_TABLE where DATE_MESSAGE=(select max(DATE_MESSAGE) from LAST_EDITED_TABLE )));
ENDIF;
COMMIT;
END;
我收到以下错误
ORA-06512: at "DIP.MESSAGEPACKAGE", line 35
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
我正在尝试更新表示谁进行了最后一次更新的行(来自同一张表的一行)。谁能帮帮我?
【问题讨论】:
-
触发器基于表 MESSAGES。如果正在对该表进行更新,则触发器将触发。但是触发器想在同一张表中做一次更新,但是表还是被第一次更新锁定了。
-
我认为您必须在 MESSAGE 表上使用 after 语句触发器。在使用的更新前触发器中,你必须填写一个plsql表,在后语句触发器中,你必须读取plsql表的记录,然后做你必须做的事情。在这种情况下,它将无限循环。 ==> 一个更新将应对另一个更新将应对另一个更新....
-
您的设计可能过于复杂。为什么不简单地要求更新程序也将正确的值更新为
messages.last_edited_by_user?
标签: plsql database-connection deadlock dml database-trigger