在Django中从多个;点击;在web界面中
我关注了这篇关于Django种族状况的帖子()。在Django中从多个;点击;在web界面中,django,concurrency,race-condition,Django,Concurrency,Race Condition,我关注了这篇关于Django种族状况的帖子()。select\u for\u update解决方案解决了多个更新相互覆盖的问题 我在同一地区有个问题。我有一个类似于任务的应用程序运行在Django之上。一个任务有多个层次;当用户通过填写答案表并单击“检查答案”按钮提供正确答案时,他将被提升到下一级别。但是,如果用户提供正确答案,然后在两个浏览器屏幕上同时单击“检查答案”,服务器端将收到两个请求 在服务器端,如果答案是正确的,还可以获得级别提升。代码类似于: self.current_level
select\u for\u update
解决方案解决了多个更新相互覆盖的问题
我在同一地区有个问题。我有一个类似于任务的应用程序运行在Django之上。一个任务有多个层次;当用户通过填写答案表并单击“检查答案”按钮提供正确答案时,他将被提升到下一级别。但是,如果用户提供正确答案,然后在两个浏览器屏幕上同时单击“检查答案”,服务器端将收到两个请求
在服务器端,如果答案是正确的,还可以获得级别提升。代码类似于:
self.current_level += 1
self.save()
即使我使用了select\u for\u update
方法,这两个请求也可能在客户端被接受,然后到达服务器。在服务器端,它们将按顺序处理,并导致两个级别的增加(而不是一个级别)。即使使用select\u for\u update
方法,也会发生这种情况
我将使用的解决方案,特别是对于实现,是在任何更新之前验证当前级别,并确保当前级别是当前问题的级别(而不是下一个)。尽管这项检查很少失败
有没有更通用的方法来处理这类问题?或者,是否需要检查级别/对象/数据的当前值,并仅在其与预期值匹配时进行更新?当然,与
选择更新方法相结合。这里的关键是在检查条件是否满足之前获取更新锁。一旦您拥有了锁,其他线程就无法更改数据,您可以自由地检查条件并进行更新。如果存在并发请求,则第二个线程将始终等待数据更新以检查条件 你好,@knbk。是的,这是有道理的。在获得锁之前,我将查看当前请求是否针对当前级别。我的问题是这张支票是否可以取消。因为,在客户端,这样的请求只能从当前级别发送。但是您可以在响应返回到客户端界面之前快速单击。