所以我有一个带可排序列的网格。在每次排序时,都会有一个像UpdataGridSorting这样的动作,它会向服务器发送带有新数据的POST请求。
在服务器上,有一种方法可以更新数据库中的数据。它以一种非常糟糕的方式执行此操作:没有锁定以防止数据库中的同时数据更新,只有锁定用于更新时的读取。
因此我遇到了一个问题:当用户多次点击排序时,会发送多个请求,他们可能会同时覆盖数据并创建脏数据。
所以我的解决方法是在某些方面对请求进行排队,并且在上次更新完成之前不要更新数据库。在哪一方创建队列更好?
现在我的意图是:
saveGridColumnSorting = (dataToSend, action, forceSend) ->
if not forceSend
queue.enqueue(dataToSend.id);
if queue.lenght > 1 and not forceSend
return
$.ajax(
url: url + "/" + action,
data: dataToSend,
success: (data) ->
if (queue.lenght > 0)
saveGridColumnSorting(queue.dequeue());
)
return
此外,如果您可以看到XY问题,请参阅有助于在答案中修复X的模式或任何可信来源。
答案 0 :(得分:0)
特别是如果系统是针对多个用户的(就像你在评论中所说的那样),那么这个客户端就有明显的风险。对于初学者来说,这是一个安全漏洞。其次,当你有多个用户发出这些电话时会发生什么?
所以它肯定应该发生在服务器上。同时,使用队列进行此类任务可能不是最明智的选择,因为通过这样做,一个用户可以通过填充队列或甚至导致整个队列轻松地为其他人创建拒绝服务因缺乏记忆而崩溃的事情。
还有一个问题是当用户A请求以一种方式对其进行排序时会发生什么,然后,在重新读取数据库之前,用户B已经提交了他们自己的排序请求,该请求已经过处理。第一个用户不会得到错误的输出,可能没有他们意识到它?
为了避免所有这些问题 - 并且只要在内存和其他可能未提供的信息方面可行 - 您可以选择保留结果集的缓存副本,您可以按请求对其进行排序,而不是修改实际的数据库。或者,如果数据库引擎可以以只读方式进行排序,那么就应该使用它。
答案 1 :(得分:0)
嗯,在客户端有队列的方案证明它在行动中起作用。但是,找到了另一种选择:在用户执行某些操作时及时阻止UI。列排序不是很好的经验,但比排队请求更安全。在服务器端排队会导致复杂性增加,尤其是对于MVC应用程序。