때때로 postgresql이 오류 교착 상태를 발생시키는 경우가 있습니다.postgresql 교착 상태
테이블에 설정된 트리거가 FOR UPDATE로 설정되었습니다. 테이블 코멘트에
2012-01-26 17:21:06 MSK ERROR: deadlock detected
2012-01-26 17:21:06 MSK DETAIL: Process 2754 waits for ExclusiveLock on tuple (40224,15) of relation 735493 of database 734745; blocked by process 2053.
Process 2053 waits for ShareLock on transaction 25162240; blocked by process 2754.
Process 2754: INSERT INTO comment (user_id, content_id, reply_id, text) VALUES (1756235868, 935967, 11378142, 'text1') RETURNING comment.id;
Process 2053: INSERT INTO comment (user_id, content_id, reply_id, text) VALUES (4071267066, 935967, 11372945, 'text2') RETURNING comment.id;
2012-01-26 17:21:06 MSK HINT: See server log for query details.
2012-01-26 17:21:06 MSK CONTEXT: SQL statement "SELECT comments_count FROM content WHERE content.id = NEW.content_id FOR UPDATE"
PL/pgSQL function "increase_comment_counter" line 5 at SQL statement
2012-01-26 17:21:06 MSK STATEMENT: INSERT INTO comment (user_id, content_id, reply_id, text) VALUES (1756235868, 935967, 11378142, 'text1') RETURNING comment.id;
그리고 트리거 :
표 주석 :
로그 (INSERT 문장이의 cutted됩니다)
CREATE OR REPLACE FUNCTION increase_comment_counter() RETURNS TRIGGER AS $$
DECLARE
comments_count_var INTEGER;
BEGIN
SELECT INTO comments_count_var comments_count FROM content WHERE content.id = NEW.content_id FOR UPDATE;
UPDATE content SET comments_count = comments_count_var + 1, last_comment_dt = now() WHERE content.id = NEW.content_id;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER increase_comment_counter_trigger AFTER INSERT ON comment FOR EACH ROW EXECUTE PROCEDURE increase_comment_counter();
가 왜이 할 수있는 일이?
감사합니다.
감사합니다. 훌륭한 일! :) – lestat
교착 상태 감지를위한 파이썬 테스트를 작성하고 업데이트를 선택하면 도움이되지 않는 것 같습니다 : ( – lestat
'업데이트 선택'을 수행하고 동일한 트랜잭션에 주석을 삽입하고 있습니까? 실제로 다른 프로세스를 차단하고 있습니다. 'select for update' 또는 삽입물에 모두 들어가야합니까? – araqnid