我正在尝试设计一个 RESTful Web API,所以我一直在研究rfc2616。我喜欢使用 ETags 进行乐观并发的想法,并试图用它来以一种安全的方式添加资源而没有竞争条件。但是,我注意到第 14.24 节中有以下两个语句:
如果请求在没有 If-Match 头字段的情况下会导致 2xx 或 412 状态以外的任何状态,则必须忽略 If-Match 头。
旨在更新资源(例如,PUT)的请求可以包含一个 If-Match 头字段,以表明如果对应于 If-Match 值(单个实体标签)的实体不再是,则不得应用请求方法该资源的表示。
我正在使用 RDBMS,并且在我尝试之前不知道事务是否会成功提交,所以我认为第一个要求似乎有点繁重。考虑一个情况,有人提供了一个If-Match
不匹配的 ETag 的标头:如果提交成功,那么我应该注意If-Match
标头,不尝试提交,并返回 412。如果提交失败,那么没有If-Match
标头的请求将导致非 2XX/412 响应,所以我必须忽略If-Match
标头,这意味着我应该尝试提交。
据我所知,我有两个选择:
- 在尝试提交之前,使用两阶段提交来预见提交是否会成功。
- 忽略上面的第一个要求,并返回 412,即使忽略
If-Match
会导致非 2XX/412 响应。(这是我倾向于的那个)
还有其他想法吗?我误解了规格吗?