카운터를 1 증가하고 얼마가 되었는지 다시 쿼리해서 읽어보면 한 쓰레드로 동작하는 경우에는 생각하는 대로 증가한 값을 볼 수 있다.
근데 동시에 4개의 요청이 들어와 있는 상태에서 증가하는 것은 transaction.atomic 머 이런걸로 처리한다 하더라도 다시 쿼리 날려서 읽는 동안 여러놈이 증가를 시켰으면 읽은 값은 내가 증가한 값이 아니라 최종 값이 읽혀져서 문제다.
역시 udpate and get 을 한번에 하는게 좋은데, Django ORM의 update 는 리턴값이 그냥 id 값인듯 하다.
답은 있지 rawquery를 이요하는것.
내가쓰는 DB가 PostgreSQL 이니까 여기에 맞는
https://stackoverflow.com/questions/60026615/how-to-get-and-update-django-object-in-one-query
query = 'UPDATE customer SET count_limit=(customer.count_limit + 1) WHERE customer.user_id=%s returning *'
updated_obj = Customer.objects.raw(query, [user.id])
너무 쉽지 여기서 리턴되는 rawqueryset 을 읽는 방법은 아래 글에서 참고
2022.07.20 - [Django] - Django - rawqueryset 필드 접근
끝.
Pexels에서 Arthur Brognoli님의 사진: https://www.pexels.com/ko-kr/photo/2440528/