【问题标题】:PL/SQL Why I get DEADLOCK on trigger action?PL/SQL 为什么我在触发操作时得到 DEADLOCK?
【发布时间】: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


【解决方案1】:

这不是你真正需要的吗?

CREATE OR REPLACE TRIGGER LAST_EDIT 
BEFORE UPDATE ON MESSAGES
FOR EACH ROW
DECLARE
  email USERS.EMAIL%type;
BEGIN     
 if :NEW.TEXT <> :OLD.TEXT THEN
  select USERS.EMAIL into 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 ));
  :NEW.LAST_EDITED = email;
END IF;
COMMIT;
END;
/

此外,查找电子邮件的查询逻辑也太复杂了。当然可以简化它。

【讨论】:

    猜你喜欢
    • 2021-07-03
    • 2014-06-02
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多