REST WCF服务中的事务处理

11
我们有一个REST WCF服务,想要在此REST服务上进行的保存操作处于事务中。是否有一种方法可以将Transaction对象通过网络传递到REST WCF服务?

我们有一个REST WCF服务,希望在其中的保存操作处于事务中。 是否有一种方法可以将Transaction对象通过网络传递到REST WCF服务?

4个回答

15

以下是罗伊·菲尔丁(Roy Fielding)的一段话,他发明了 REST 这个术语:

如果你发现自己需要一个分布式事务协议,那么你怎么可能说你的架构是基于 REST 的呢?我根本看不出你如何从一种情况(在客户端使用 RESTful 应用程序状态和超媒体来确定所有状态转换)到另一种情况(需要分布式同意事务语义,在其中客户端必须告诉服务器如何管理其自身资源)。

... 目前我认为“rest transaction”是一个自相矛盾的说法。

这段话摘自2009年6月9日REST-discuss列表中的一条消息


好的,那么Fielding应该解释清楚(这本身就是一个任务),我应该如何告诉服务器:创建这两个资源,但同时,而不是先创建这个资源,然后再创建另一个资源。 - Stefano Borini
3
POST /MyResourcePairs 我希望给你一个更真实的例子,但你会发现,在大多数需要进行交易的情况下,用户只使用一个名词来指代该事件。因此,从最终用户的角度来看,你所描述的情况非常罕见。 - Darrel Miller
换言之,这将违反无状态约束。 - inf3rno

2
我大部分同意达雷尔的回答中引用的罗伊·菲尔丁的观点。您不应该通过RESTful Web服务公开应用程序的底层操作,例如数据库事务。但是,您可以以更加功能化的方式处理分布式事务。
假设您正在实现一个销售点系统,可以收集购买礼品券。客户应该能够将礼品券与信用卡付款相结合。礼品券和信用卡支付都由销售点外部的系统处理。收集礼品券并进行信用卡付款应该是原子性交易。为了简单起见,让我们关注一种情况:客户首先收集礼品券,然后用信用卡支付其余金额。信用卡付款可能会失败,因此当发生这种情况时,您还想回滚礼品券收集。
礼品券服务公开了一个URL来启动收集过程:
/gift-voucher/{gift-voucher-id}/collection

请求此URL将创建并持久化礼品券的预订。响应包含一个指向预订的URL:

/gift-voucher/{gift-voucher-id}/collection/reservation/${reservation-id}

这个URL可以被POST或DELETE以分别执行或取消礼品券的收集。

请注意,此方法仅适用于应用程序服务,在其中有功能用例可回滚事务(例如失败的信用卡付款)。尝试将其应用于实体服务等较低级别的服务可能涉及大量工作并表现不佳。在这种情况下,您可能会想知道RESTful服务是否真的是最佳选择。


1

WCF中的事务支持是通过众多WS-*标准之一来处理的,而这些标准仅适用于SOAP - 我非常怀疑webHttpBinding将会直接支持事务。

不过,您可能需要查看一下ADO.NET数据服务,它们是建立在WCF REST之上的一层。

请参阅ADO.NET DataServices团队的博客文章

Marc


0

这里有一个关于该主题的最新讨论:http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataservices/thread/e66651c0-9202-4049-a8f4-55971b8b359d

基本上它说:单个请求不支持事务,并且支持它们没有意义,因为在单个POST / PUT / DELETE请求中仅涉及一个实体和CUD操作。但是可以通过以下方式在服务器端实现事务:

  • 使用批处理请求(从客户端发送一整个包含POST / PUT / DELETE请求的捆绑到服务器)
  • 并利用处理管道(在处理事件中开始事务,并在已处理事件中提交/回滚事务)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接