如何在数据库中完成事务但连接问题导致异常时解决案例?

时间:2012-12-10 09:26:44

标签: c# .net sql-server azure azure-sql-database

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

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

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

解决此类案件的典型方法是什么?

3 个答案:

答案 0 :(得分:0)

使用DTC和远程交易,至少你正在妥善处理这个问题。你必须从当地"到分发"分发"交易。这本身就存在问题,但没有其他方法可以正确地做到这一点。

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

答案 1 :(得分:0)

我建议使用Enterprise Library Transient Fault Handling Block。我们已经开始将其纳入我们的Web角色。

答案 2 :(得分:0)

完全解决问题的唯一方法是进行事务idempotent,这是一种奇特的说法,无论你运行多少次程序,最终状态都是正确的。一旦你这样做,那么第一个交易(或第二个,第三个,第四个等)是否失败并不重要。你只是继续努力,直到它工作,然后你知道你已经得到了正确的状态。

你如何实现幂等性是情境性的。在许多情况下,您可以使用保护条款来检查您是否已处于所需状态,但有时您可能需要执行更复杂的操作。