分享 使用 Etag 在并发控制中实现乐观锁机制

hooopo · 2015年04月06日 · 最后由 hooopo 回复于 2015年04月08日 · 2560 次阅读

在并发场景中,多个客户端同时操作同一个资源,会出现一种情况:有客户端操作的资源在未知情况被发生了变更。

举个简单的例子:

用户 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 情况也类似,只需要给返回资源都加上一个标识。

太机智了。👍

这个房子好!

#1 楼 @est #2 楼 @huobazi

《REST 实战》里有提到。

但不是如果用户 B 发送了评论后用户 A 又修改了帖子,最终看上去不还是怪怪的?要么一个帖子有人评价后就不能改,要么改了之后就清楼?

还是觉得实时推送帖子修改的通知更好

#5 楼 @luikore 实时推送好复杂,当然做起来同时解决其他问题,Etag 只要几行代码。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号