我有两个表,A和B以及一个简单的表X,它维护两者之间的关系。 X包含AID和BID作为其主键。
我正在使用Linq-to-Sql来插入类似的关系:
public void InsertRelationship(int y, int z) {
DataContext.X.InsertOnSubmit(new x { AID = y; BID = z });
}
问题是在极端情况下可以调用两次对InsertRelationship()的调用,因此会因重复记录而抛出异常。这对我来说无关紧要,因为我知道当时的关系存在,所以我忽略了异常。
在这种情况下可以忽略异常还是不好的做法?在插入之前,我应该检查关系是否已经存在?这会如何影响性能?
更新
无法避免对InsertRelationship()的重复调用。它是一个Web应用程序,所以我无法阻止用户打开两个单独的窗口并调用该方法两次,例如。通过典型的用户交互不会调用该方法两次,但我在这里针对极端情况进行编程。重复的百分比可能会非常低,但我还不能确定确切的数字。
答案 0 :(得分:2)
一般来说,你应该先检查一下。
但可能更准确的说,您应该构建应用程序的接口,这样就不会出现通过典型的用户交互甚至可能产生您需要检查的情况的情况。
无论如何,更好的做法是检查。
答案 1 :(得分:2)
忽略异常的主要问题是,对于其他与您不想隐藏的重复记录完全无关的问题,可能会抛出异常,例如SQL超时或死锁等。
最好的解决方案是构建你的应用程序,以便不会发生欺骗性插入,下一个最好的方法是在插入之前检查它们的存在。
如果性能至关重要,则无法避免欺骗插入,插入插入与工作插入的比例非常小,您可以看出引发的异常只是由于重复问题,您可能最好只是抓住例外并忽略它。但这是一个有很多条件的情况: - )
答案 2 :(得分:2)
就性能而言,抛出异常是昂贵的。此外,您获得的例外情况绝不会保证每次出于同样的原因。在再次添加行之前,您应该始终检查该行是否存在,因为您知道问题可能存在。
例外是针对特殊情况 - 这不是例外,这是创建数据的正常流程的一部分。
答案 3 :(得分:1)
虽然不太可能,但是没有检查然后插入记录竞争条件?如果是这样,你应该为它进行防御性编程,这意味着要捕捉并检查任何异常。
在这种情况下,您应该在选择忽略它之前检查Exception的类型和/或它的基础错误号。这样,您可以忽略与尝试插入重复记录(可能是主键约束违规)相关的异常。您需要以不同方式处理其他类型的例外。
答案 4 :(得分:0)
如果你确定没有插入记录只是因为它已经存在,它应该没问题。其他明智的忽视异常可能会隐藏其他危险的东西。