django中的幂等插入

jpfvwuh4  于 2021-07-27  发布在  Java
关注(0)|答案(0)|浏览(204)

我想在django中实现一个幂等postapi来处理并发请求(比如retry)。我试着用下面的算法来计算:
客户端为每个事件生成一个唯一的id(如uuid)
客户端向api发送一个具有生成的id的事件
当api接收到事件时:
如果未注册事件,api将插入事件并更新相关统计信息(例如,增加用户表中的“事件数”列),然后将其发送回客户端
如果事件已经注册,只需将统计信息(由另一个并发请求计算)发送回客户端
下面的django程序是否如我所期望的那样有效?

def register_event(req: Request):
    user_id: int = req.user_id
    event_id: UUID = req.event_id

    with transaction.atomic():
        event, created = (
            Event
            .objects
            .select_for_update()  # row-level locking in transaction
            .get_or_create(user_id=user_id, event_id=event_id, defaults={...})
        )

        if created:
            # Update the related table based on the event

            # Increment the number of events
            User.objects.filter(id=user_id).update(num_events=F('num_events') + 1)

            ...

        num_events = User.objects.get(id=user_id).num_events

        return num_events

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题