Удаление SQL с помощью транзакции

#sql

#sql

Вопрос:

У меня есть таблица, в которой есть идентификатор, имя, возраст. (Имя таблицы: Employee)

Идентификатор является первичным ключом в таблице. Существует процедура Sproc, которая удаляет запись с заданным именем. Итак, в моем sproc для удаления я сначала выбираю идентификатор на основе имени. Если имя допустимо, то я выполняю удаление.

 DECLARE @Id uniqueidentifier
BEGIN TRANSACTION
    SELECT TOP 1 @Id=Id FROM Employee WHERE Name=@Name
    IF @@ROWCOUNT = 0
    BEGIN
        ROLLBACK TRANSACTION
        RETURN ERROR_NOT_FOUND
    END                 
    DELETE FROM EMPLOYEE WHERE Id = @Id            
    IF @@ROWCOUNT = 0
    BEGIN
        ROLLBACK TRANSACTION
        RETURN ERROR_NOT_FOUND
    END
COMMIT TRANSACTION
  

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

Пожалуйста, прокомментируйте приведенный выше сценарий, требуется ли транзакция.. и каковы плюсы / минусы с транзакцией / без транзакции.

Комментарии:

1. Самое первое, что вам нужно изменить идентификатор получения, используя name. это небезопасно !! .

2. Хранить возраст в виде столбца в таблице тоже странно — вероятно, безопаснее и стабильнее хранить неизменяемое значение (DoB) и использовать вычисленный возраст в хранимой процедуре, или временной таблице, или представлении.

Ответ №1:

Что касается ответа на ваш вопрос — если нет сотрудника с таким именем, ни delete, ни select ничего не изменят в базе данных, таким образом, откат не требуется.

Теперь, если идентификатор уникален, а имя нет — выбор сотрудника по имени довольно опасен, поскольку у вас нет реального контроля над тем, какого сотрудника (из тех, у кого такое же имя) вы собираетесь удалить. Похоже, что эта процедура должна принимать id в качестве параметра, а не выбирать его по имени.

Ответ №2:

В вашем примере кода оба ROLLBACK оператора фактически ничего не откатывают назад, поскольку в обоих случаях вы ничего не изменили в базе данных. Другими словами, нет, в них нет необходимости.