Webservice 中的 Oracle 事务回滚
Posted
技术标签:
【中文标题】Webservice 中的 Oracle 事务回滚【英文标题】:Oracle Transaction Rollback in Webservice 【发布时间】:2012-01-11 12:37:07 【问题描述】:我有几个事务将表单数据插入到 oracle 表中。
if (InsertQuarterly() == true)
InsertMeasures();
如果insertmeasures
程序成功执行,那么我必须调用另一个程序。
在InsertQuarterly
内,我正在调用 Web 服务方法将数据插入 Oracle 表
例如
sOUT = ws_service.InsertQuarterly(txtQ2dTarget.Text, txtQ3dTarget.Text)
对于InsertMeasures
,我正在调用网络服务
sOUT = ws_service.InsertMeasures(txtachieveGold.Text, txtachieveDia.Text)
我的问题是如果InsertQuarterly
成功执行,但如果InsertMeasures
在事务期间失败,那么我也想回滚InsertQuarterly
。
我怎样才能做到这一点?我可以使用OracleTransaction
和transaction.Rollback()
。
但是我使用不同的网络服务方法进行交易。
这里如何管理回滚和提交?
处理交易的最佳程序是什么?
【问题讨论】:
【参考方案1】:您需要网络服务提供商的配合。
Web 服务标准确实允许服务提供商提供跨服务调用的事务行为。根据我的经验,很少有服务作者支持事务性。如果您使用的服务提供此类功能,那么您需要阅读在您的环境中使用 WS-AtomicTransaction 的细节。
但是,提供此类交易服务存在相当大的开销和运营复杂性,这很可能是很少有人这样做的原因。我首选的解决方案是提供一个结合了 InsertQuarterly 和 InsertMeasures 功能的粗粒度服务——该实现可以非常容易地在单个服务调用中管理 Oracle 事务。
另一种可能性是开发幂等服务(可以安全地多次调用的服务。)然后客户端有责任重复调用 InsertQuarterly() 和 InsertMeasures() 直到两者都工作,只有在以下情况下才能安全地重复调用服务是幂等的。
所有这些方法都需要您的服务提供者实施一些合适的方法,您无法仅在客户端代码中解决此问题。
【讨论】:
以上是关于Webservice 中的 Oracle 事务回滚的主要内容,如果未能解决你的问题,请参考以下文章