python - 在 Django rest api 中缓慢的互联网连接时更新数据
问题描述
视图.py
class Bet(UpdateAPIView):
"""
Sample method
"""
def put(self, request, *args, **kwargs):
with transaction.atomic():
instance = self.get_object()
if request.data.get('i') == 1:
#some code
elif request.data.get('i') == 2:
#some code
elif request.data.get('i') == 3:
#some code
elif request.data.get('i') == 4:
#some code
else:
## a large block of code also **it create a new entry for request user and bet in 3-4 tables.**
instance.user = request.user
instance.save()
return custom_render(status_code, message, response_status)
这里有两个用户(user1 和 user2)在缓慢的互联网连接中同时调用 API。
现在由于连接速度慢,两个 API 都通过了所有验证和代码执行到达else 块。并将为两个用户创建条目。
这里我的问题是,如果任何用户接受投注,那么没有人可以接受相同的投注。
在快速的互联网连接中,通过检查 request.data.get('i') == 1 True 并返回响应可以正常工作。
解决方案
这个理论未经测试,但我怀疑你可以.select_for_update()
在你的视图的查询集属性上抛出一个。
.get_object()
调用.get_queryset()
,并且由于您的代码在原子块中执行,因此应锁定该行,直到事务完成。
class Bet(UpdateView):
queryset = Bet.objects.all().select_for_update()
def put(self, request, *args, **kwargs):
with transaction.atomic():
instance = self.get_object()
...
推荐阅读
- python - data.rolling().mean() 在控制台中有效,但在运行时无效
- c# - 读取 dbase IV 文件 C#
- dataframe - 将数据拆分为新列
- python - 如何使用 librosa 将 .ogg opus 解码为 int16 NumPy 数组?
- java - 结果集自动关闭
- spring-boot - 反应式弹簧云安全(使用 Keycloak):会话到期?
- python-3.x - 在 Python 中的文本文件中搜索通配符模式
- python - 假设我的主页中有一个搜索框和一个结果页面来显示结果,我如何在另一个视图中显示 django-filter 结果?
- c# - Quartz.Net 减少日志记录/删除特定消息 Serilog
- python - Django Ckeditor 文件上传 - 路径错误?