SQL删除与事务

时间:2011-04-30 11:54:22

标签: sql

我的桌子有id,名字,年龄。 (表名:员工)

id是表中的主键。有一个Sproc删除给定名称的条目。 所以在我的删除中,我首先根据名称选择id。如果名称有效,那么我会删除。

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

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

请评论上述情况是否需要交易..以及有/无交易的利弊。

2 个答案:

答案 0 :(得分:1)

在您的示例代码中,两个ROLLBACK语句实际上并没有回滚任何内容,因为在这两种情况下您都没有更改数据库中的任何内容。换句话说,不,它们不是必需的。

答案 1 :(得分:1)

至于你的问题的答案 - 如果没有这个名字的员工既不删除也不选择不会改变数据库中的任何内容,因此无需回滚。

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