program story

“transaction.atomic”은“transaction.commit_on_success”와 동일합니까?

inputbox 2020. 12. 1. 07:58
반응형

“transaction.atomic”은“transaction.commit_on_success”와 동일합니까?


Django 1.6은 @transaction.atomic1.5에서 트랜잭션 관리의 리 홀의 일부로 제안합니다 .

cron에 의해 차례로 호출되는 Django 관리 명령에 의해 호출되는 함수가 있습니다. 즉,이 경우 트랜잭션을 트리거하는 HTTP 요청이 없습니다. 단편:

from django.db import transaction

@transaction.commit_on_success
def my_function():
    # code here

위의 코드 블록 commit_on_success에서는에서 수행되는 모든 작업에 대해 단일 트랜잭션을 사용합니다 my_function.

대체 하는가 @transaction.commit_on_success@transaction.atomic동일한 동작이 발생할? @transaction.atomic 문서 상태 :

원자 성은 데이터베이스 트랜잭션의 정의 속성입니다. atomic을 사용하면 데이터베이스의 원 자성이 보장되는 코드 블록을 만들 수 있습니다. 코드 블록이 성공적으로 완료되면 변경 사항이 데이터베이스에 커밋됩니다. 예외가있는 경우 변경 사항이 롤백됩니다.

나는 그들이 같은 행동을하게된다고 생각합니다. 옳은?


예. 당신은 사용해야합니다 atomic이전에 사용한 장소에서 commit_on_success.

하지만 새로운 트랜잭션 시스템은 더 강력하고 일관되게 설계되었으므로 다른 동작을 볼 수 있습니다. 예를 들어, 데이터베이스 오류를 포착하고 계속하려고 TransactionManagementError하면 이전 동작이 정의되지 않았고 아마도 대소 문자에 따라 달라지는 반면.

그러나 일을 제대로하고 있다면 모든 것이 같은 방식으로 계속 작동해야합니다.


주제에 대해 읽은 문서에 따르면 이러한 데코레이터가 중첩 될 때 상당한 차이가 있습니다.

atomic블록을 중첩하는 것은 두 commit_on_success블록 을 중첩하는 것과 동일하게 작동하지 않습니다 .

문제는 이러한 블록에서 원하는 두 가지 보장이 있다는 것입니다.

  • 블록의 내용이 원자 적이거나 블록 내부의 모든 것이 커밋되거나 아무것도 커밋되지 않기를 원합니다.
  • 내구성을 원합니다. 예외없이 블록을 떠난 후에는 블록 내부에 작성한 모든 내용이 영구적임을 보장합니다.

블록이 중첩 될 때 두 가지 보장을 모두 제공하는 것은 불가능합니다. 가장 안쪽 블록을 떠난 후 가장 바깥 쪽 블록을 떠나기 전에 예외가 발생하면 다음 두 가지 방법 중 하나로 실패해야합니다.

  • 가장 안쪽 블록에 내구성을 제공하지 못했습니다.
  • 가장 바깥 쪽 블록에 원 자성을 제공하지 못했습니다.

여기에서 차이점을 찾을 수 있습니다. 사용 commit_on_success하면 가장 안쪽 블록에는 내구성이 있지만 가장 바깥 쪽 블록에는 원 자성이 없습니다. 을 사용 atomic하면 가장 바깥 쪽 블록에 원 자성을 부여 할 수 있지만 가장 안쪽 블록에는 내구성이 없습니다.

중첩의 경우 예외를 발생시키는 것만으로도 문제가 발생하는 것을 방지 할 수 있습니다. 가장 안쪽 블록은 항상 예외를 발생 시키므로 내구성을 보장하지 않습니다. 그러나 이것은 약간의 유연성을 잃습니다.

더 나은 해결책은 당신이 요구하는 것에 대해 더 세분화하는 것입니다. 원자 성과 내구성을 별도로 요청할 수 있다면 중첩을 수행 할 수 있습니다. 내구성을 요구하는 모든 블록이 원 자성을 요구하는 블록 밖에 있는지 확인하기 만하면됩니다. 원 자성을 요청하는 블록 내에서 내구성을 요청하면 예외가 발생해야합니다.

atomic원 자성 부분을 제공해야합니다. 내가 말할 수있는 한 django 1.6.1에는 내구성을 요청할 수있는 데코레이터가 없습니다. 나는 하나를 작성했는데, 게시 코드 검토에 있습니다.

참고 URL : https://stackoverflow.com/questions/21861207/is-transaction-atomic-same-as-transaction-commit-on-success

반응형