【发布时间】:2016-08-02 11:49:46
【问题描述】:
我有一个长时间运行的 POST 请求,它使用请求的结果更新会话。
现在,当此类并发 POST 请求来自同一个会话时,更新完成 在并发请求中彼此之间不可见。
效果是,在少数并发请求中完成的会话更新最终会丢失。
这种情况一般是怎么处理的?
【问题讨论】:
我有一个长时间运行的 POST 请求,它使用请求的结果更新会话。
现在,当此类并发 POST 请求来自同一个会话时,更新完成 在并发请求中彼此之间不可见。
效果是,在少数并发请求中完成的会话更新最终会丢失。
这种情况一般是怎么处理的?
【问题讨论】:
所以,简而言之,场景是这样的:
您应该首先澄清 - 并发性是问题域固有的,还是由用户错误(例如单击某些控件两次)产生的?
在后一种情况下,双重提交和双重请求处理都可以通过类似锁的机制来防止。
如果并发是应该发生,您需要定义处理这些并发请求的语义。
也许最后一个作者获胜,或者请求的操作是可交换的,可以一起应用。
一旦确定了这些语义,将它们转换为代码应该很容易。也就是说,听起来 Clojure 的引用类型(atom/agent/ref)或数据库的设施都比会话对象更适合。
【讨论】: