Должен ли я игнорировать исключение при вставке базы данных? - PullRequest
2 голосов
/ 24 августа 2009

У меня есть две таблицы, 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 () нельзя избежать. Это веб-приложение, поэтому я не могу остановить пользователя, открывающего два отдельных окна и вызывающих метод, например, дважды. Метод не будет вызываться дважды через обычное взаимодействие с пользователем, но я программирую здесь в крайнем случае. Процент дубликатов, вероятно, будет очень низким, но я не могу быть уверен в точных цифрах.

Ответы [ 5 ]

2 голосов
/ 24 августа 2009

Бросать исключения дорого с точки зрения производительности. Кроме того, исключение, которое вы получаете, никогда не гарантируется по одной и той же причине каждый раз. Вы должны всегда проверять, существует ли строка, прежде чем добавлять ее снова, поскольку вы знаете, что проблема может существовать с самого начала.

Исключения составляют исключительные обстоятельства - это не исключение, это часть обычного процесса создания данных.

2 голосов
/ 24 августа 2009

Основная проблема с простым игнорированием исключения состоит в том, что исключение может быть вызвано для других проблем, вообще не связанных с дублирующейся записью, которую вы не хотите скрывать, например, для тайм-аутов SQL или взаимоблокировок среди других.

Лучшим решением было бы создать ваше приложение таким образом, чтобы вставка dupes не происходила. Следующим наилучшим решением будет проверка их существования перед выполнением вставки.

Если производительность критична, нельзя избежать вставки dupes, отношение вставки dupes к работающей вставке очень мало, и вы можете сказать, что повышенное исключение связано только с проблемой дублирования, возможно, вам лучше просто поймать исключение и игнорирование его. Но это с множеством условий: -)

2 голосов
/ 24 августа 2009

Как правило, вы должны проверить в первую очередь.

Но, возможно, более точно, вы должны сконструировать интерфейс для своего приложения таким образом, чтобы он не представлял случай, когда даже при обычном взаимодействии с пользователем возможно даже создать случай, который вам необходимо проверить .

Независимо от этого, лучше проверять.

1 голос
/ 11 февраля 2011

Хотя это маловероятно, не проверяет и не вставляет ли запись состояние гонки? Если это так, вы должны программировать на это с защитой, что означает перехват и проверку любых исключений.

В этом случае вам следует проверить тип исключения и / или его номер ошибки, прежде чем игнорировать его. Таким образом, вы можете игнорировать только исключения, связанные с попытками вставить дублирующуюся запись (вероятно, нарушение ограничения первичного ключа). Вы захотите по-разному обрабатывать другие типы исключений.

0 голосов
/ 24 августа 2009

Если вы уверены, что запись не вставлена ​​только потому, что она уже существует, все должно быть в порядке. Другое мудрое игнорирующее исключение может скрывать что-то еще опасное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...