0
나는 다음과 같은 트리거PL/SQL 왜 트리거 동작에서 DEADLOCK이 발생합니까?
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 테이블을 기반으로합니다. 이 테이블의 업데이트가 완료되면 트리거가 실행됩니다. 그러나 트리거는 동일한 테이블에서 업데이트를 원하지만 테이블은 첫 번째 업데이트에 의해 여전히 잠겨 있습니다. – wieseman
MESSAGE 테이블에서 after 문 트리거를 사용해야한다고 생각합니다. 업데이트 전에 사용되는 트리거에서 plsql 테이블을 채우고 after 문 트리거에서 plsql 테이블의 레코드를 읽은 다음 수행해야 할 작업을 수행해야합니다. 이 경우 무한 루프가됩니다. ==> 업데이트로 인해 다른 업데이트로 업데이트됩니다 .... – wieseman
디자인이 너무 복잡 할 수 있습니다. 단순히 업데이터가 올바른 값을'messages.last_edited_by_user'로 업데이트하는 것을 요구하지 않는 것이 좋을까요? – user272735