代码之家  ›  专栏  ›  技术社区  ›  David Glenn

我应该忽略数据库插入的异常吗?

  •  2
  • David Glenn  · 技术社区  · 15 年前

    我有两个表,A和B,还有一个简单的表,X,它维护了两个表之间的关系。X包含辅助和投标作为其主键。

    我正在使用Linq to SQL插入关系,例如:

    public void InsertRelationship(int y, int z) {
      DataContext.X.InsertOnSubmit(new x { AID = y; BID = z });
    }
    

    问题是,在极端情况下可以调用两个insertrelationship()调用,因此会因为重复的记录而引发异常。这对我来说并不重要,因为我知道这段关系存在,所以我忽略了这个例外。

    在这种情况下,忽略一个例外是可以的,还是仍然是不好的做法?在插入之前,我是否应该检查该关系是否已经存在?这将如何影响性能?

    更新

    无法避免对InsertRelationship()的重复调用。它是一个Web应用程序,因此我无法停止用户打开两个单独的窗口并调用该方法两次,例如。该方法不会通过典型的用户交互被调用两次,但我在这里针对极端情况进行编程。复制品的比例可能很低,但我还不能确定确切的数字。

    5 回复  |  直到 14 年前
        1
  •  2
  •   Vinko Vrsalovic    15 年前

    忽略异常的主要问题是,对于与您不想隐藏的重复记录完全无关的其他问题,例如SQL超时或死锁等,可能会引发异常。

    最好的解决方案是构造应用程序,这样就不会发生dupes插入,其次最好是在执行插入之前检查它们的存在。

    如果性能非常关键,则无法避免dupes插入,dupes插入与工作插入的比率非常小,并且您可以知道引发的异常只是由于重复问题,您最好只捕获异常并忽略它。但这是一个有很多条件的if:-)

        2
  •  2
  •   Noon Silk    15 年前

    一般来说,你应该先检查一下。

    但可能更准确地说,您应该构建应用程序的接口,这样它就不会在通过典型的用户交互甚至可能生成您需要检查的情况的地方出现这种情况。

    不管怎么做,最好的做法是检查。

        3
  •  2
  •   Sam    15 年前

    就性能而言,抛出异常代价很高。而且,每次你得到的例外情况都不能保证是出于同样的原因。在再次添加行之前,应始终检查该行是否存在,因为您知道问题可能首先存在。

    例外情况适用于例外情况——这不是例外情况,这是创建数据的正常流程的一部分。

        4
  •  1
  •   Will Rogers    14 年前

    虽然不太可能,但不检查并插入记录是否为比赛条件?如果是这样,您应该为它编写防御程序,这意味着捕获并检查任何异常。

    在这种情况下,您应该先检查异常的类型和/或它的基本错误号,然后再选择忽略它。这样,您就可以忽略与尝试插入重复记录(可能是主键约束冲突)相关的异常。您将希望以不同的方式处理其他类型的异常。

        5
  •  0
  •   TheVillageIdiot    15 年前

    如果您确定记录不是因为已经存在而插入的,那么应该可以。另一种聪明的忽视例外可能会隐藏一些危险的东西。