如何处理“静默”数据库事务成功的一般情况

时间:2013-12-08 23:12:49

标签: sql database transactions reliability

this related question中,我问我如何确保不会尝试将相同的数据插入数据库两次。但是,我现在担心更一般的情况。

具体来说,我担心我在可能不可靠的通信介质上异步访问的任何数据库,这样交易可能会成功,但由于在错误的时间失败,我从未发现成功,也不知道我是否需要稍后重试操作。我的想法是,我需要执行一些事务,并且由于网络条件而在本地失败,我必须继续尝试直到成功。

由于不可靠,这可能是任何来自互联网连接的地方,其中返回数据包无法联系到我,一直到我本地呼叫的本地机器,但我的程序在交易开始后但在之前被杀死收到回复(这里会想到Linux的OOM杀手。)

总结我之前的问题,如果我严格限制我正在做的只是插入包含一些唯一数据的新行,我可以通过构建一个查询来避免重新插入这些行,我首先尝试选择新的数据,如果我找到它就不要插入。

但是,如果没有这些限制,我就不知道如何防止“沉默的成功”。如果我需要随意创建表,更新现有表中的值,从这些表中删除,甚至删除表,我怎样才能确保我不做已经完成的事情?似乎这个问题在所有异步数据库中都存在,除非它们是经过精心设计的,例如我在上一个问题中使用过的用例。然而,数据库是如此普遍,我从来没有听到任何人提到这个问题或如何处理它,我只能得出结论,三件事之一是真的:

  1. 问题是存在的,但它并不广为人知或在地毯下扫描,因为它本质上是一种可能很少见的竞争条件,并且当它确实发生时可能由于不可再生性而被识别。
  2. 很少有人为关键应用程序做任何有趣的事情而需要这样的功能,因此任何此类应用程序都受限于我之前的问题,以便不需要任意保护。
  3. 有一个已知的解决方案,但可能由于默默无闻或由于不熟悉术语而我没有找到它是什么。
  4. 如果可能,我对最常见的情况感兴趣,而不是特定的SQL服务器,因为我所做的基本上是编写一个非特定于任何特定服务器的通用API。但是,如果有某些服务器比其他服务器更好地处理这个服务器,或者那些服务器没有,那么我也有兴趣了解它。

0 个答案:

没有答案