get_or_create 는 thread safe 한가요? 여기저기 검색해봤는데 문제없다는

 
Hyoungchul Shim

get_or_create 는 thread safe 한가요?
여기저기 검색해봤는데 문제없다는 글도 있고 불완전하다는 글도 있고;;

예를 들어 특정 Box를 찾거나 생성해서 item_count + 1 하려는 코드를 짜는데

Box.objects.get_or_create(owner=me, label=’c’)
Box.objects.get(owner=me, label=’c’).update(item_count=F(‘item_count’) +1)

이런 형태면 충분한가요, 아니면 transaction을 사용해야 할까요?

  • Cho SeongSoo

    get_or_create 자체는 thread safety 하지 않은 걸로 알고 있습니다.

    근데 증가할 값에 F() 를 사용하셔서 아마 실행결과는 thread safety 하지 않을 까 조심스럽게 생각해봅니다…

    get_or_create 내부에서는 select 하고 결과가 없으면 insert 를 하거덩요..

    좋은 방법은 transaction 을 걸어주셔보시는게.. get_or_create 에서 데이터가 2개가 생길 수 가 있거덩요.

    Park Hyungbum

    upsert룰 하시려면 update_or_create가 더 나은 방법 아닐까요?

    Donghyun Cho

    update_or_create도 소스 코드를 보시면 get()먼저 실행하고 없으면 생성하는데요, 예로 드신 2개의 커멘드를 하나로 묶는건 어려울 듯 합니다.
    https://github.com/django/django/blob/master/django/db/models/query.py#L478
    대신, 두 번째 쿼리는 F() 오브젝트를 사용했기 때문에 굳이 transaction으로 묶지 않아도 한 번의 쿼리로 업데이트가 되기 때문에 안전하다고 알고 있어요.

Advertisements