C# 如何通过web服务实现长时间运行的事务,如工作单元

C# 如何通过web服务实现长时间运行的事务,如工作单元,c#,wcf,rest,transactions,unit-of-work,C#,Wcf,Rest,Transactions,Unit Of Work,我正在设计一个web服务和一个使用web服务的桌面客户端应用程序。接口要求您能够执行多个操作并一次提交所有操作。这些操作是基本的CRUD操作(创建、读取、更新、删除) 下面是一个粗略的、具体的工作流示例: POST /car create with response 202 POST /seat create with response 202 etc. POST /unit-of-work response 200 问题是服务调用可能会随着时间的推移而分散。我最初创建了一个RE

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

下面是一个粗略的、具体的工作流示例:

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

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

编辑:一个重要的规定是,鉴于上述示例,服务器上的数据库中必须存在一辆汽车,以便向其添加座位。在一个事务中,该car应该只对在该事务中工作的人员(会话)可用。这限制了在工作流结束时一次性将所有操作发送到web服务的能力

到目前为止,我考虑的方案有:

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

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

我的问题是,1)是可能的,还是好主意/坏主意?2)是个好主意吗?有没有跨web服务(REST或SOAP)实现这一点的模式/工具?或者有其他方法来处理此问题吗?

我会尝试以下方法:

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

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

我已经编写了WCF REST服务,它使用了近30多个对象,所有CRUD操作都在一个事务中完成。这样做没有害处。谢谢你的回复。我已经添加了一项规定,以澄清为什么这在我的情况下不起作用。这是因为为了给汽车添加座椅,汽车必须存在于数据库中,供用户会话使用。但是,如果创建座位失败,整个会话必须回滚。谢谢Eric。很抱歉遗漏了详细信息,但我已经添加了一项规定,即该用户的会话/事务必须存在于数据库中,以便向其添加座位。这意味着你的第二种方法可能接近我想要的。您可以在数据库中创建实体,但只有在使用某种会话令牌或工作单元令牌进行查询时,它们才可用。不过,我希望SOAP分布式事务能够为我解决这个问题。你知道SOAP事务是否可以用于这类事情吗?我想是的。我对SOAP不是很精通。根据我到目前为止所做的一些研究,SOAP中的长时间运行的事务不是它们设计的目的,要实现类似的东西,您必须使用补偿来更新会话期间所做的任何更改,但我仍在研究它。