Web服务和数据库之间的事务是否可能?

时间:2011-07-10 10:25:15

标签: c# asp.net web-services

我想调用Web服务在其数据库中插入记录,然后我想在其他城市的远程数据库中插入记录,如果Web服务成功完成操作的话。

这是一个简化的示例代码:

IdentificationSystem.Service Identify = new IdentificationSystem.Service();
        string result= Identify.InsertWorkshopInfo(BosWorkshop.WpSvUserName, BosWorkshop.WpSvPassword,BosWorkshop.WkIcode,BosWorkshop.WpName)

if (result==0)//If success
 {
   Connect to a remote database and then insert a record 
}

根据我的示例代码,如果通过Web服务和Web服务插入的数据返回成功但是我无法在其他城市的远程数据库中插入记录将会发生什么。 像连接松散的东西。

我该怎么办?我可以在这里使用System.transaction name space吗? 我正在自己编写Web服务代码。

2 个答案:

答案 0 :(得分:4)

如果两个服务器都在运行分布式事务处理协调器(MSDTC),那么可以使用分布式事务。

TransactionScope交易将使用DTC自动升级。

但是,您应该考虑其影响:跨服务器的长时间运行事务可能并不可取。此外,还有安全和防火墙方面的考虑因素。

答案 1 :(得分:1)

处理分布式事务see this document 存在WS标准,但使用这些标准要求Web服务的作者应选择提供符合那些更高级规范的接口。这为Web服务的实现和管理增加了相当大的复杂性,因此很少有服务提供商选择这样做。

如果缺乏某种分布式交易协调,任何此类一致性的责任在于客户,即。您。实际上,你需要保持一个可靠的记录,你想要做什么(我需要在这里这个那里),然后有一些机智来应对失败,例如在将来某个时候重试,或者如果第二个插入变得不可能则撤消第一个插入。

各种“流程编排”产品试图简化这些规则的编码,但这是一个完全难以解决的问题。举几个例子:

  • 您使用的每项服务都需要具备某种撤销功能。某些服务(例如发送电子邮件)自然不会撤消。其他人有撤销的财务成本(例如取消预订可能需要支付押金)。更糟糕的是,一些服务auathor不提供撤消功能。
  • 您并不总是知道某项操作是否已实际完成。您发送请求,然后崩溃,因此看不到响应。现在,你是否重试并冒险(比方说)双借记?理想情况下,服务作者提供幂等服务(可以安全地处理对同一操作的重复请求的服务)和/或一些查询功能,可以让您发现请求的命运。

我一般认为您依赖于服务提供商为您提供的服务允许您“组合”您想要的多更新功能。如果你非常不走运,你想做什么可能是不可能的。然后,您可以回退到某些故障情况的手动更正。真实世界的企业实际上做了很多。人们通过电话确定发生了什么,调整订单,甚至要求取消订单。如果失败的可能性很小,那么开发防弹系统可能是一种更具成本效益的方法。

相关问题