在研究 REST 时,可能任何人都会首先注意到,没有定义任何事务语义,有人说这是隐含地违背了 REST 的本质,而其他人说任何这样做的尝试都会导致“污染”REST 系统。
但是为了便于讨论,我们可以说 REST 确实成为了一个流行的‘ api’选择,而且宇宙中的每个站点都开始公开 restful 入口点。
如果没有事务行为(我说的是无补偿) ,这些到底是如何可用的?因为在我看来 REST 的好处之一就是它可以分解数据的组成部分,您可能会认为这使得智能客户机可以从多个服务组合数据(并添加和调整这些组合数据)。但是如果我不能独立地自动地对这种数据组合进行更改,那么使用 REST 就变得毫无用处。
随着时间的推移和对严肃数据公开的需求的到来,我们需要简单的东西(REST 在这里获胜) ,并支持事务行为,这样我们就可以可靠地操作这些数据。
现在,我已经在我的研究中读过几次一个特定的论点,它与我们应该如何在 REST 中考虑事务有关,给出的例子是购物车,在购物车中你隐式地有隔离,因为购物车是你的。
However I disagree with this argument, firstly, the isolation a shopping cart has is merely convenient, this isn't a transaction isolation.. what happens if I'm simultaneously doing an operation against my cart whilst some part of my application is reading data from it? I wouldn't expect the reading part of my application to see data that is 'still in transaction'.
更不用说,并非所有数据更改都有隐式事务模型,多个服务上的事务肯定没有。
在我看来,事务需要发生,而且需要以一种能够让实际的 REST 调用忽略这一事实的方式发生(添加其余的有效负载是一个很大的不可以,但添加头是可以的)。
我阅读了一些关于如何在 REST 上创建事务模型的建议,其中一些正在编写的规范似乎是最近的。
你有什么真正的想法吗?难道不应该有比 REST 更多的东西吗? 这样就可以利用 REST 的简单性来对抗可靠的数据操纵(“酸性”事务)。
如果不是这样的话,我们是否应该加大赌注,告诉服务开发人员,如果他们想要在纯数据世界中交互,他们需要支持像肥皂这样可以说是单一的东西?或者更糟糕的是,尝试将他们自己的定制事务支持构建到诸如 REST 之类的东西中,使得每个服务都变得非标准化,从而打破了 REST 的全部威力?
提前谢谢你的建议。
编辑,添加简短的场景:
假设一个客户端表单处理一个专辑的创建,为了方便在这个专辑上,而不是要求用户为艺术家资源提供 uri,他们可以从一个艺术家列表中选择(很可能是从艺术家目录中获得的)。
For sake of usability the client can write the artist name in manually so they can create an artist 'inline'.. in the posting scenario, the client code understands this, and before sending the request to create the album, it firstly attempts to determine if the artist already exists, if so, gets the uri for that artist, otherwise creates the artist and gets the artists uri.
然后客户端代码继续创建相册,这是比通常的客户端更聪明的,它不是坐在 REST 和“哑”发布之上,而是有一些交互处理更纯粹的 REST 逻辑。
然而,在这种情况下,如果艺术家是第一个被创建的,那么最好保证艺术家不会被创建,除非专辑被创建。
这并不像事务所暗示的那样“关键”,但是它定义了一组工作,客户机代码希望这些工作作为一个操作进行(毕竟,它使得这对用户来说看起来像是一个单独的操作)。
对于这个场景,我看到的唯一指导方针是,在专辑创建失败的情况下,让客户机执行补偿操作,并专门调用删除艺术家。但这似乎有问题,因为客户假设艺术家是孤立的,尽管这可能不太可能,如果另一个客户已经“看到”该艺术家,并分配给它会发生什么?
这些是我关于数据更改的担忧,当然还有其他的空白(谁说艺术家不能只是在稍后的日期删除) ,这些动作是不透明的(即,这些动作不是由客户端自动完成的,而是用户特别要求的)。
我希望这有助于阐明这个话题。