Как сохранить транзакцию, когда она терпит неудачу для некоторых строк?
Я хочу, чтобы когда я выполняю запрос, например DELETE FROM Contact
и во время транзакции возникает ошибка, она должна удалить строки, которые могут быть удалены, что поднимает все соответствующие ошибки для строк, которые не могут быть удалены.
3 ответа
Для SQL Server вы не собираетесь нарушать атомарность команды Delete в пределах одного оператора - даже если он выполняется вне явной транзакции, вы будете действовать в рамках неявного - например, все или ничего, как вы видели.
В пределах явной транзакции ошибка по умолчанию откатит всю транзакцию, но это можно изменить, чтобы просто попытаться откатить один оператор, который допустил ошибку в общей транзакции (из нескольких операторов), для которой установлено значение SET XACT_ABORT.
Поскольку ваше удаление - это одно утверждение, XACT_ABORT не может вам помочь - в строке произойдет ошибка, и удаление будет отменено.
Если вы знаете, с какой ошибкой вы столкнетесь (например, нарушение ограничения FK), вы можете убедиться, что у удаления есть подходящее предложение where, чтобы не пытаться удалить строки, о которых вы знаете, что это приведет к ошибке.
Это функция, которая будет полностью зависеть от того, какую версию базы данных вы используете. У некоторых это будет, а у некоторых нет.
Например, Oracle предлагает нам возможность массово регистрировать ошибки DML. В примере в документации используется оператор INSERT, но тот же принцип применяется к любому выражению DML.
Если вы используете MySQL, вы можете воспользоваться DELETE IGNORE
синтаксис