语境
由于REST体系结构样式的无状态性(涉及每个请求完全独立),导致服务器从不存储有关客户端的任何信息。
因此,悲观并发控制不合适,因为这将要求服务器存储哪个客户端获得资源锁定。然后在Etag
标头的帮助下使用乐观并发控制。(顺便说一句,正如我在那儿问的/programming/30080634/concurrency-in-a-rest-api)
问题
乐观并发控制机制的主要问题在于,您始终允许所有客户端执行任何操作。
我想避免这种情况,而不会破坏REST的无状态原则。我的意思是,所有客户端都无法随时执行任何操作。
题
在我看来,采用半乐观并发控制机制是可能的,例如:
- 客户可以请求令牌
- 只能生成一个令牌,并且有效期有限
- 要对资源(例如POST或PUT)执行操作,客户端必须将此令牌作为请求正文(或标头?)的一部分提供。没有令牌的客户端无法执行这些操作。
它与开放式并发控制非常相似,不同之处在于,只有一个客户端可以执行某些操作(获得令牌的操作)……与“所有客户端可以执行所有操作”相反。
这种机制是否与REST架构风格兼容?它打破了它的任何约束吗?我当时想问一下SO,但这似乎是一个与软件设计有关的高级问题。
Etag
?的区别 随着Etag
你永远不会相信你的操作就完成了,你可以有一个情况下,你将永远不会执行任何操作。使用锁,您至少可以执行操作。因此,拥有一个简单的锁只是在可能发生“高冲突”和“罕见冲突”的环境之间进行调整。
Transaction
显式地将其建模为资源。