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。 我怎样才能做到这一点?我可以使用OracleTransactiontransaction.Rollback()。 但是我使用不同的网络服务方法进行交易。 这里如何管理回滚和提交?

处理交易的最佳程序是什么?

【问题讨论】:

【参考方案1】:

您需要网络服务提供商的配合。

Web 服务标准确实允许服务提供商提供跨服务调用的事务行为。根据我的经验,很少有服务作者支持事务性。如果您使用的服务提供此类功能,那么您需要阅读在您的环境中使用 WS-AtomicTransaction 的细节。

但是,提供此类交易服务存在相当大的开销和运营复杂性,这很可能是很少有人这样做的原因。我首选的解决方案是提供一个结合了 InsertQuarterly 和 InsertMeasures 功能的粗粒度服务——该实现可以非常容易地在单个服务调用中管理 Oracle 事务。

另一种可能性是开发幂等服务(可以安全地多次调用的服务。)然后客户端有责任重复调用 InsertQuarterly() 和 InsertMeasures() 直到两者都工作,只有在以下情况下才能安全地重复调用服务是幂等的。

所有这些方法都需要您的服务提供者实施一些合适的方法,您无法仅在客户端代码中解决此问题。

【讨论】:

以上是关于Webservice 中的 Oracle 事务回滚的主要内容,如果未能解决你的问题,请参考以下文章

关于oracle 触发器,与事务回滚

oracle中的事务

oracle断网后事务无法回滚

oracle 提交事务后为啥不能撤销或回滚,不是有撤销段吗

oracle中的保存点是啥

Oracle的自治事务