如何在REST中实现粗粒度乐观锁



我已经为REST资源实现了乐观锁定,这些资源具有到数据库表的1对1映射,通过将GET中的版本号传递回PUT调用。如果数据库中的版本号在我执行GET和PUT之间发生了更改,则发生了乐观锁异常。设计很简单。

现在,如何对映射到多个数据库表的复合REST资源执行同样的操作?我希望不必返回多个版本字段(与复合资源相关的每个数据表一个)。复合资源的一个简单例子是/FooBar,其中/Foo和/Bar是非复合资源。

我主要是在寻找Fowler的粗粒度锁定模式的REST实现示例:http://martinfowler.com/eaaCatalog/coarseGrainedLock.html

这就是ETag标头的设计目的。实现它的一种非常常见的方法是生成响应负载,对其进行散列(它不必是安全的,只需要低冲突),然后将该散列用作ETag的值。请注意,这种方法不知道有多少来源参与了生成响应。

然后,客户端将接收到的ETag发送回"如果匹配"标头,服务器可以使用该标头来检查请求的新鲜度。

最新更新