【问题标题】:How to implement long-running transactions over a web service, like unit of work如何通过 Web 服务实现长时间运行的事务,例如工作单元
【发布时间】:2014-03-13 20:57:42
【问题描述】:

我正在设计一个 Web 服务和一个使用该 Web 服务的桌面客户端应用程序。该接口要求您能够执行多个操作并一次提交所有操作。这些操作是基本的 CRUD 操作(创建、读取、更新、删除)。

这是一个粗略的、经过汽车化的工作流程示例:

问题在于服务调用可能会随着时间的推移而分散。我最初创建了一个 REST Web 服务,但根据定义,REST 不应该是事务性的。界面必须能够一次性将所有操作提交到数据库(单击“保存”按钮)。

编辑: 一个重要的规定是,对于上面的例子,一个 Car 必须存在于服务器上的数据库中才能添加座位。在事务中,该车应该只对在该事务中工作的人(会话)可用。这限制了在工作流结束时一次性将所有操作发送到 Web 服务的能力。

目前我考虑的选项是:

1) 使用 SOAP (WCF) 实现分布式事务,并且仅在 GUI 上单击“保存”时提交。对于更长的事务生命周期,这可能/一个好主意吗?

2) 创建一个工作单元“服务”,它接受操作并在服务器上的一个事务中执行所有操作。

我的问题是,1) 是可能的,还是一个好/坏的主意? 2) 是个好主意吗?是否有任何模式/工具可以跨 Web 服务(REST 或 SOAP)实现这一点?或者有什么不同的方法来处理这个问题?

【问题讨论】:

  • 我已经编写了 WCF REST 服务,它需要近 30 多个对象,并且所有 CRUD 操作都在一个事务中完成。这样做没有害处。
  • 感谢您的回复。我添加了一个规定来澄清为什么这在我的情况下不起作用。这是因为为了给汽车添加座位,汽车必须存在于用户会话的数据库中。但是,如果创建席位失败,则必须回滚整个会话。

标签: c# wcf rest transactions unit-of-work


【解决方案1】:

我会试试这个:

POST /unit-of-work 
   create with response 200
POST /car
   create with response 202
POST /seat
   create with response 202
etc.
PUT /unit-of-work
   set "execute" bit, or somesuch

在这种情况下,汽车、座椅等在发布时会指定工作单元。当工作单元更新为“完成”时,所有项目都将执行。

另一种方法是:

POST /car
   create with response 202
POST /seat
   create with response 202
etc.
POST /unit-of-work response 200

在这种情况下,汽车、座椅等设置了一些说明它们尚未创建。工作单元应该指定属于它的资源,然后后端可以翻转其他资源的位以便创建它们。

【讨论】:

  • 谢谢埃里克。抱歉缺少详细信息,但我添加了一条规定,即 Car 必须存在于该用户的会话/交易的数据库中,以便向其中添加座位。这意味着您的第二种方法可能接近我正在寻找的方法。您可以在数据库中创建实体,但只有在使用某种会话令牌或工作单元令牌查询时才可用。
  • 但是,我希望 SOAP 分布式事务能够为我解决这个问题。您是否碰巧知道 SOAP 事务是否可以用于此类事情?
  • 我想是的。我对 SOAP 并不是很精通。
  • 根据我迄今为止所做的一些研究,soap 中的长时间运行事务不是它们的设计目的,要实现这样的事情,你必须使用补偿来更新所做的任何更改在会议期间,但我仍在调查。
猜你喜欢
  • 2014-03-27
  • 1970-01-01
  • 2016-11-09
  • 1970-01-01
  • 2012-01-09
  • 2013-10-01
  • 2019-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多