我的桌子有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
我的问题是我是否需要在这种情况下进行交易。我知道当我们想要原子操作时,我们需要一个事务(一组操作应该一起通过/失败)。
请评论上述情况是否需要交易..以及有/无交易的利弊。
答案 0 :(得分:1)
在您的示例代码中,两个ROLLBACK
语句实际上并没有回滚任何内容,因为在这两种情况下您都没有更改数据库中的任何内容。换句话说,不,它们不是必需的。
答案 1 :(得分:1)
至于你的问题的答案 - 如果没有这个名字的员工既不删除也不选择不会改变数据库中的任何内容,因此无需回滚。
现在,如果id是唯一的且名称不是 - 通过名称选择员工非常危险,因为您无法真正控制要删除哪个员工(来自同名员工)。看起来这个过程应该将id作为参数,而不是按名称选择它。