Web服务应该是事务性的吗?

时间:2011-07-12 17:05:43

标签: web-services rest wsdl

我正在研究为应用程序编写Web服务。在此应用程序中,我们在事务中执行所有操作,因为“工作单元”通常不是单个实体,而是跨多个表的多个实体。在某些情况下,我们想要“全有或全无”,交易也很有意义。我不确定如何在网络服务中这样做,也不是我应该这样做。

我觉得Web服务应该是无状态的,并且提供的API应该基于每个实体构建,但我不确定如何处理“一个部分失败的”工作单元“,应该发生回滚。 / p>

Web服务应该是事务性的吗?您如何实施交易,是否会发送“开始交易”并以“结束交易”结束?

如果网络服务是无国籍的,你如何处理非独立的“工作单位”? 关于这个主题我是否有任何权威文献?

感谢,

2 个答案:

答案 0 :(得分:5)

关于这个主题的规范性论文之一是Pat Helland的Life Beyond Distributed Transactions: an Apostate's Opinion。强烈推荐。

答案 1 :(得分:4)

Web服务可能是幕后的全部或不是,但您可以选择向客户公开的内容。

如果您希望客户端了解提交/回滚行为,则必须在API中提供“补偿事务”。因此,如果一个用例创建一个新事务,您必须提供一个补充方法来删除它,并告诉用户创建成功或失败。与所有其他方法相同。

我认为这暴露了服务正在做的太多事情。客户被迫了解太多。这是一个糟糕的封装。

我认为将这些知识隐藏在服务中是一种更好的设计。向用户报告成功或失败,但就是这样。

这意味着您必须将服务设计为粗粒度,以包含完整的工作单元。让它协调数据源和其他服务以完成用例。