Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Django中从多个;点击;在web界面中_Django_Concurrency_Race Condition - Fatal编程技术网

在Django中从多个;点击;在web界面中

在Django中从多个;点击;在web界面中,django,concurrency,race-condition,Django,Concurrency,Race Condition,我关注了这篇关于Django种族状况的帖子()。select\u for\u update解决方案解决了多个更新相互覆盖的问题 我在同一地区有个问题。我有一个类似于任务的应用程序运行在Django之上。一个任务有多个层次;当用户通过填写答案表并单击“检查答案”按钮提供正确答案时,他将被提升到下一级别。但是,如果用户提供正确答案,然后在两个浏览器屏幕上同时单击“检查答案”,服务器端将收到两个请求 在服务器端,如果答案是正确的,还可以获得级别提升。代码类似于: self.current_level

我关注了这篇关于Django种族状况的帖子()。
select\u for\u update
解决方案解决了多个更新相互覆盖的问题

我在同一地区有个问题。我有一个类似于任务的应用程序运行在Django之上。一个任务有多个层次;当用户通过填写答案表并单击“检查答案”按钮提供正确答案时,他将被提升到下一级别。但是,如果用户提供正确答案,然后在两个浏览器屏幕上同时单击“检查答案”,服务器端将收到两个请求

在服务器端,如果答案是正确的,还可以获得级别提升。代码类似于:

self.current_level += 1
self.save()
即使我使用了
select\u for\u update
方法,这两个请求也可能在客户端被接受,然后到达服务器。在服务器端,它们将按顺序处理,并导致两个级别的增加(而不是一个级别)。即使使用
select\u for\u update
方法,也会发生这种情况

我将使用的解决方案,特别是对于实现,是在任何更新之前验证当前级别,并确保当前级别是当前问题的级别(而不是下一个)。尽管这项检查很少失败


有没有更通用的方法来处理这类问题?或者,是否需要检查级别/对象/数据的当前值,并仅在其与预期值匹配时进行更新?当然,与
选择更新方法相结合。

这里的关键是在检查条件是否满足之前获取更新锁。一旦您拥有了锁,其他线程就无法更改数据,您可以自由地检查条件并进行更新。如果存在并发请求,则第二个线程将始终等待数据更新以检查条件

你好,@knbk。是的,这是有道理的。在获得锁之前,我将查看当前请求是否针对当前级别。我的问题是这张支票是否可以取消。因为,在客户端,这样的请求只能从当前级别发送。但是您可以在响应返回到客户端界面之前快速单击。