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

时间:2013-02-03 21:49:26

标签: java rest optimistic-locking

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

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

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

1 个答案:

答案 0 :(得分:5)

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

然后,客户端将收到的ETag发送回If-Match标头,服务器可以使用该标头检查请求的新鲜度。