Как сохранить транзакцию, когда она терпит неудачу для некоторых строк?

Я хочу, чтобы когда я выполняю запрос, например DELETE FROM Contactи во время транзакции возникает ошибка, она должна удалить строки, которые могут быть удалены, что поднимает все соответствующие ошибки для строк, которые не могут быть удалены.

3 ответа

Решение

Для SQL Server вы не собираетесь нарушать атомарность команды Delete в пределах одного оператора - даже если он выполняется вне явной транзакции, вы будете действовать в рамках неявного - например, все или ничего, как вы видели.

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

Поскольку ваше удаление - это одно утверждение, XACT_ABORT не может вам помочь - в строке произойдет ошибка, и удаление будет отменено.

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

Это функция, которая будет полностью зависеть от того, какую версию базы данных вы используете. У некоторых это будет, а у некоторых нет.

Например, Oracle предлагает нам возможность массово регистрировать ошибки DML. В примере в документации используется оператор INSERT, но тот же принцип применяется к любому выражению DML.

Если вы используете MySQL, вы можете воспользоваться DELETE IGNORE синтаксис

Другие вопросы по тегам