1

在我的 Azure Web 服务中,我有调用 SQL Azure 中的存储过程的代码。有时会发生这种情况,以便存储过程完成,但之后连接断开,调用者得到一个SqlException声称Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

然后调用者将重新打开连接并尝试重新运行相同的代码。问题是代码首先检查数据库表是否存储“正确的状态”,并且由于上述存储过程已经运行,数据库状态已经改变,因此检查失败并抛出异常。

所以问题是调用代码依赖于“无异常”等于“数据库更改正常”的条件,因此如果出现异常,则数据库没有更改。在这种情况下,例外是由于发生数据库更改后的临时连接问题,因此假设结果是错误的。

处理此类情况的典型方法是什么?

4

3 回答 3

0

使用 DTC 和远程事务,那么至少您可以正确处理此问题。您必须将其从“本地”事务提升为“分布式”事务。这本身就有问题,但几乎没有其他方法可以正确地做到这一点。

或者,您可以重新编程,以便在代码中正确处理这种情况。

于 2012-12-10T09:30:39.200 回答
0

完全解决问题的唯一方法是使事务具有幂等性,这是一种奇特的说法,即无论您运行该过程多少次,最终状态都是正确的。一旦你这样做了,那么第一个事务(或第二个、第三个、第四个等)是否失败都没有关系。您只需继续尝试直到它起作用,然后您就会知道您的状态是正确的。

您如何实现幂等性取决于具体情况。在许多情况下,您可以使用保护子句来检查您是否已经处于所需的状态,但有时您可能需要做一些更复杂的事情。

于 2012-12-11T15:38:56.723 回答
0

我建议使用Enterprise Library Transient Fault Handling Block。我们已经开始将它整合到我们的 Web 角色中。

于 2012-12-10T22:13:03.997 回答