首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >REST中的事务?

REST中的事务?
EN

Stack Overflow用户
提问于 2008-09-29 01:33:53
回答 6查看 83.6K关注 0票数 157

我想知道您如何在REST中实现以下用例。有没有可能在不影响概念模型的情况下做到这一点?

读取或更新单个事务范围内的多个资源。例如,将100美元从Bob的银行帐户转到John的帐户。

据我所知,实现这一点的唯一方法是作弊。您可以发布到与John或Bob关联的资源,并使用单个事务执行整个操作。就我而言,这打破了REST架构,因为您本质上是通过POST传输RPC调用,而不是真正操作单个资源。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2008-09-29 02:13:31

考虑一个RESTful购物篮场景。购物篮在概念上是您的事务包装器。与将多个商品添加到购物篮,然后提交购物篮以处理订单的方式相同,您可以将Bob的帐户条目添加到事务包装器,然后将Bill的帐户条目添加到包装器。当所有组件都就位后,您就可以POST/PUT包含所有组件组件的事务包装器了。

票数 93
EN

Stack Overflow用户

发布于 2011-01-20 06:46:28

有一些重要的情况没有被这个问题回答,我认为这太糟糕了,因为它在Google上的搜索词排名很高:-)

具体地说,一个很好的恰当方法是:如果你发布了两次(因为中间的一些缓存发生了问题),你不应该两次转移数量。

为此,您需要创建一个事务作为对象。这可能包含您已经知道的所有数据,并将事务置于挂起状态。

代码语言:javascript
复制
POST /transfer/txn
{"source":"john's account", "destination":"bob's account", "amount":10}

{"id":"/transfer/txn/12345", "state":"pending", "source":...}

一旦你有了这个事务,你就可以提交它,就像这样:

代码语言:javascript
复制
PUT /transfer/txn/12345
{"id":"/transfer/txn/12345", "state":"committed", ...}

{"id":"/transfer/txn/12345", "state":"committed", ...}

请注意,此时多个puts并不重要;即使是txn上的GET也会返回当前状态。具体地说,第二个PUT将检测到第一个put已经处于适当的状态,并返回它--或者,如果您试图在它已经处于" committed“状态之后将其置于"rolledback”状态,您将得到一个错误,并返回实际提交的事务。

只要您与单个数据库或具有集成事务监视器的数据库通信,这种机制实际上就会工作得很好。您还可以为事务引入超时,如果您愿意,甚至可以使用Expires头来表示。

票数 63
EN

Stack Overflow用户

发布于 2014-03-09 11:57:25

如果您在这里总结一下讨论,很明显REST不适合许多API,特别是当客户机-服务器交互本质上是有状态的时,就像对于非平凡的事务一样。对于客户端和服务器端,为什么要跳过所有建议的圈套,以便学究地遵循一些不适合问题的原则呢?一个更好的原则是为客户端提供最简单、最自然、最高效的方式来编写应用程序。

总之,如果你真的在你的应用程序中做了很多事务(类型,而不是实例),你真的不应该创建RESTful应用程序接口。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/147207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档