我正在开发 WCF 服务,以帮助我们的新代码与旧系统互操作。过程是这样的:
- 客户端通过对遗留系统的请求调用服务。
- 服务将请求写入数据库。
- 遗留系统服务在自己的时间从数据库请求并将结果写回数据库(更新状态标志以表示结果已准备好)。
- 客户端通过调用第二个服务方法来检索结果,该方法会轮询数据库,直到设置就绪标志。
- 就在返回结果之前,服务将状态标志更新为client has results,以便可以删除相关的 DB 行。
我担心的是最后一步的比赛条件。我可以看到这种情况发生:
- 服务向客户端更新状态有结果。
- 客户端等待服务轮询数据库后超时。
- 服务尝试返回结果。欢闹随之而来。
解决此问题的一种方法是使用三个服务调用而不是两个:第二个调用检索结果,最后一个调用是客户端明确确认它拥有它们。我想知道是否有一种方法不会将这种额外的“协议”负担强加给客户端。
我已经简要地研究了在 WCF 中使用事务,听起来他们可能能够做我需要的事情。客户端(可选)启动一个事务,将其流向服务,如果它存在则使用它,并在完成时提交它。这似乎隐含地进行了“第三次调用”。
这个想法有什么好处吗?你能看出什么缺点吗?还有其他我可以探索的途径吗?