-
[Django] Django의 Transaction 처리Django 2023. 11. 6. 17:52728x90
Django의 Transaction
*Mysql은 버전에 따라 Django의 트랜잭션이 적용되지 않을 수도 있다.
*Mysql 버전이 트랜잭션을 지원하지 않으면, Django는 항상 오토커밋 모드로 기능읋 할 것이다.
- View 함수를 실행하기 전에 Django는 트랜잭션을 시작한다. Response에 문제가 없다면, Django는 트랜잭션을 커밋한다.
- 만약 view에 예외가 발생했다면, Django는 트랜잭션을 롤백한다.
View가 StreamingHttpResponse를 반환한다면, response의 내용을 읽는 행위는 내용을 만들기 위해서 코드를 실행시킬 것이다.
*StreamingHttpResponse(HLS)
HTTP/1.1 및 HTTP/2와 같은 최신 HTTP 프로토콜에서 지원
: 데이터를 조각조각 보내고 수신자는 데이터 조각을 순차적으로 처리한다. 큰 파일을 다운로드하거나 비디오를 스트리밍하는 데 자주 사용되며, 실시간 데이터 전송에도 활용된다.- 데이터를 패킷 단위로 나누어 전송
- 지연 최소화 : 데이터를 빠르게 전송할 수 있으므로 수신자는 대기 시간없이 처리 가능
- 부하 분산 : 한번에 많은 데이터를 보내지 않아도 되기 때문에, 서버 부하 분산 가능
- 대용량 파일 처리 : 대용량 파일을 다운로드하거나 스트리밍하는 데 사용
- 실시간 데이터 : 주식 시세 데이터, 실시간 게임 스트림 등이 해당
Atomic
Generate_relationships()가 데이터베이스 에러를 일으킬지라도, add_children()에서의 쿼리를 실행할 수 있으며, Create_parent()로부터의 변경 사항은 동일 트랜잭션에서 유지될 것이다.
Generate_relationships() 내에서 시도된 어떤 오퍼레이션이든 handle_exception()이 호출되면서 안전하게 롤백되었다는 것에 주의하자.
Atomic 블록은, 평범하게 종료되거나 커밋할지 롤백할지에 대해 결정하기 위해 예외가 발생한다.
만약 atomic 블록에서 예외를 처리한다면, Django로부터 문제가 발생했던 사실을 숨길 수 있다. -> DatabaseError / IntegerityError
이 에러가 발생하면, 트랜잭션은 깨지고 Django는 atomic block에서 롤백을 실시한다.
이 상황에서 롤백 전 데이터베이스 쿼리를 실행하면, Django는 TransactionManagementError를 일으킨다.
(ORM과 연관된 신호 처리기가 예외를 일으켰을 때도 TransactionManagementError 발생)
따라서 Atomic 블럭 내에서 예외를 처리하려는 시도는 지양하고, atomic 블럭 주변에서 에러를 잡으려고 해야 한다.
필요하다면 의도하여 atomic block을 추가로 두는 것이다. 이 방식은 명시적으로 어떤 오퍼레이션들이 롤백될 것인지 구분할 수 있게 되는 이점을 가진다.
트랜잭션 롤백이 실행되더라도 모델 내 필드의 값은 되돌아가지 않을 것이다. 원래 필드값을 저장하지 못한다면 이것은 일관되지 않은 모델의 상태로 이끌 수 있다.
코드가 즉시 객체를 저장한 뒤에 캐시의 데이터를 업데이트한다면, 트랜잭션이 커밋될때까지 캐시의 변경을 미루는 대신에transaction.on_commit() 을 사용하기를 권장한다.
캐싱이나 전역 변수의 측면에서도 atomic의 원리는 적용된다, 만약 코드가 객체인스턴스를 저장 후 캐시 데이터를 업데이트하고 싶다면, transaction_on_commit() 을 사용하는 것을 추천한다.
[Django 의 트랜잭션 관리 코드 용례]
- opens a transaction when entering the outermost atomic block;
- creates a savepoint when entering an inner atomic block;
- releases or rolls back to the savepoint when exiting an inner block;
- commits or rolls back the transaction when exiting the outermost block.
Autocommit
SQL 표준상 각 SQL 쿼리는 다른 쿼리가 active한 상태가 아니라면 트랜잭션을 시작한다.
이 같은 트랜잭션들은 반드시 커밋되거나 롤백된다
오토커밋이 작동되고 어떠한 트랜잭션이 활성화되지 않고 있다면, 각 SQL 쿼리는 자신의 트랜잭션을 도맡는다. 다시 말해, 각 쿼리들은 트랜잭션을 시작할 뿐만아니라, 트랜잭션은 자동으로 쿼리의 성공 여부에 따라 커밋되거나 롤백됨을 의미한다.
- AUTOCOMMIT=False 처리하게 된다면 Django의 트랜잭션 관리를 끌 수 있다. 만약 이렇게 하면 Django는 오토커밋을 사용하지 못하고, 어떤 커밋도 실행하지 못한다.
On_commit() : open 트랜잭션이 성공적으로 커밋된 뒤에 실행될 callback 함수를 등록하게끔 해준다
Callback 함수는 어떤 인자도 받지 않지만, functors의 partial 메서드로 묶을 수 있다.
콜백은 아직 완료되지 않은 트랜잭션이 성공적으로 커밋된 이후에 호출된다. 만약 트랜잭션이 롤백된다면(처리되지 않은 예외가 atomic 블럭 내에 발생한다면) 콜백 함수는 무시되고, 절대 호출되지 않는다.
완료된 트랜잭션이 진행된 때에 on_commit()을 호출한다면, 콜백은 즉시 수행될 것이다.
Savepoint
Savepoint는 정확하게 다뤄진다. Savapoint 뒤에 on_commit 함수는 바깥 트랜잭션이 커밋된 이후에 호출될 것이다. 그러나 만약 그 이전 saveepoint에서 롤백이나 혹은 트랜잭션 동안에 롤백이 일어났다면 실행되지 않는다.
On_commit은 그들이 등록된 순서에 따라 트랜잭션이 수행된다.
728x90'Django' 카테고리의 다른 글
[Django] Django Throttling (1) 2024.02.02 [Django] 로그 설정하는 법 (0) 2024.01.10 [Django] CHAR 적용하기 (1) 2024.01.02 [Django] Mysql-client 설치 오류 (0) 2023.11.12 Django Signals (1) 2023.11.12