在并发场景中,多个客户端同时操作同一个资源,会出现一种情况:有客户端操作的资源在未知情况被发生了变更。
举个简单的例子:
用户 A 发了一个帖子,内容为post-a
,用户 B 看到了post-a
之后在下面写评论,在 B 写评论期间用户 A 把帖子内容改成了post-aa
。会产生的一个问题是,用户 B 针对post-a
写的评论看起来怪怪的^_^
解决办法很简单,在 B 看到 A 的时候就给他一个帖子资源标识 tag-1,B 提交评论时连同这个标识 tag-1 一同提交。服务器在接受请求之前验证先验条件,如果当时帖子内容无任何变化,仍然是 tag-1,成功。
如果帖子内容变化,新标识为 tag-2,与 B 提交的 tag-1 不符合,表示期间资源发生了变化,返回 412 Precondition Failed。然后刷新页面也好,提示也好,让 B 知道这一变化继续评论。
API 情况也类似,只需要给返回资源都加上一个标识。