Threaded Django 작업이 트랜잭션 또는 db 연결을 자동으로 처리하지 않습니까?
나는 Django가 자신의 스레드에서 반복되는 작업을 실행하도록 설정했고, 그들은 항상 미완성 된 데이터베이스 연결 프로세스 (pgsql "Idle In Transaction")를 남겨두고 있다는 것을 알았습니다.
Postgres 로그를 살펴본 결과 트랜잭션이 완료되지 않았 음을 발견했습니다 (ROLLBACK 없음). 내 기능에 다양한 트랜잭션 데코레이터를 사용해 보았습니다.
수동 트랜잭션 관리로 전환하고 롤백을 수동으로 수행했지만 작동했지만 프로세스는 여전히 "유휴"상태로 남아 있습니다.
그래서 connection.close ()를 호출했고 모든 것이 정상입니다.
하지만 저는 궁금합니다. 왜 Django의 일반적인 트랜잭션 및 연결 관리가 기본 Django 스레드에서 생성되는 이러한 스레드 작업에 대해 작동하지 않습니까?
몇 주 동안 Django 소스 코드를 테스트하고 읽은 후 내 질문에 대한 답을 찾았습니다.
업무
Django의 기본 자동 커밋 동작은 여전히 내 스레드 함수에 적용됩니다. 그러나 Django 문서에는 다음과 같이 나와 있습니다.
데이터베이스에 작성해야하는 작업을 수행하자마자 Django는 INSERT / UPDATE / DELETE 문을 생성 한 다음 COMMIT를 수행합니다. 암시 적 ROLLBACK이 없습니다.
마지막 문장은 매우 문자 그대로입니다. Django의 무언가가 더티 플래그를 설정하지 않는 한 ROLLBACK 명령을 실행하지 않습니다. 내 함수는 SELECT 문만 수행했기 때문에 더티 플래그를 설정하지 않았고 COMMIT를 트리거하지 않았습니다.
이것은 Django가 시간대에 대해 SET 명령을 발행했기 때문에 PostgreSQL이 트랜잭션에 ROLLBACK이 필요하다고 생각한다는 사실에 위배됩니다. 로그를 검토 할 때 이러한 ROLLBACK 문을 계속보고 Django의 트랜잭션 관리가 소스라고 가정했기 때문에 자책했습니다. 그렇지 않다는 것이 밝혀졌고 괜찮습니다.
사이
연결 관리는 일이 까다로워지는 곳입니다. Django는 signals.request_finished.connect(close_connection)
일반적으로 사용하는 데이터베이스 연결을 닫는 데 사용합니다. Django에서는 일반적으로 요청과 관련이없는 아무 일도 일어나지 않으므로이 동작을 당연한 것으로 간주합니다.
하지만 제 경우에는 작업이 예약 되었기 때문에 요청이 없었습니다. 요청이 없다는 것은 신호가 없음을 의미합니다. 신호 없음은 데이터베이스 연결이 닫히지 않았 음을 의미합니다.
트랜잭션으로 돌아가서 connection.close()
트랜잭션 관리에 대한 변경 사항이없는 상태에서 단순히 호출을 실행하면 내가 찾던 PostgreSQL 로그에 ROLLBACK 문이 생성되는 것으로 나타났습니다.
해결책
해결책은 일반적인 Django 트랜잭션 관리가 정상적으로 진행되도록 허용하고 세 가지 방법 중 하나로 연결을 간단히 닫는 것입니다.
- 연결을 닫고 필요한 기능을 감싸는 데코레이터를 작성하십시오.
- Django가 연결을 닫도록 기존 요청 신호에 연결합니다.
- 기능 종료시 수동으로 연결을 닫습니다.
이 세 가지 중 하나가 작동합니다.
이것은 몇 주 동안 나를 미치게 만들었다. 앞으로 다른 사람에게 도움이되기를 바랍니다.
ReferenceURL : https://stackoverflow.com/questions/1303654/threaded-django-task-doesnt-automatically-handle-transactions-or-db-connections
'programing tip' 카테고리의 다른 글
"하향 funargs"는 무엇입니까? (0) | 2020.12.30 |
---|---|
2 개의 열을 기반으로 SQL 고유 제약 조건을 생성하려면 어떻게해야합니까? (0) | 2020.12.30 |
이 응답에 대해 getOutputStream ()이 이미 호출되었습니다. (0) | 2020.12.30 |
문자열에 점이있을 때 "is"키워드가 다른 동작을하는 이유는 무엇입니까? (0) | 2020.12.30 |
파이썬에서 오류가 없을 때까지 시도하십시오 (0) | 2020.12.30 |