2011-04-30 65 views
0

我有一个表,有id,名称,年龄。 (表名:员工)SQL删除与交易

该id是表中的主键。有一个Sproc删除给定名称的条目。 因此,在我的删除存储过程中,我首先选择基于名称的ID。如果名字是有效的,那么我做一个删除。

DECLARE @Id uniqueidentifier 
BEGIN TRANSACTION 
    SELECT TOP 1 @Id=Id FROM Employee WHERE [email protected] 
    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 

我的问题是我是否需要在这种情况下需要交易。我知道我们需要一个事务,当我们想要原子操作时(一组操作应该一起通过/失败)。

请注意上述情况是否需要交易..以及有/没有交易的优点/缺点是什么。

+0

大多数第一件事你需要改变使用名称获取ID。它不安全! 。 – 2011-04-30 12:00:33

+0

将表存储为表中的列也很奇怪 - 可能更安全,更稳定地存储不变值(DoB),并在存储过程或临时表或视图中使用计算的年龄。 – 2011-04-30 17:04:26

回答

1

至于你的问题的答案 - 如果没有这个名字的雇员既不删除也不选择不会改变数据库中的任何东西,因此回滚是没有必要的。

现在,如果id是唯一的,并且名称不是 - 通过名称选择员工非常危险,因为您无法真正控制要删除的员工(来自同名公司的员工)。看起来这个程序应该把id作为参数,而不是按名称来选择它。

1

在你的示例代码中,两个ROLLBACK语句实际上并没有回滚任何东西,因为在这两种情况下你都没有改变数据库中的任何东西。换句话说,不,他们没有必要。