首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Delete with Transaction

SQL Delete with Transaction
EN

Stack Overflow用户
提问于 2011-04-30 19:54:22
回答 2查看 16.8K关注 0票数 0

我有一个表,里面有id,name,age。(表名: Employee)

id是表中的主键。有一个存储过程,它删除给定名称的条目。因此,在要删除的存储过程中,我首先根据名称选择id。如果名称有效,则执行删除操作。

代码语言:javascript
复制
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

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

对于上述场景,请评论是否需要事务处理。使用/不使用事务的优缺点是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-30 22:05:44

至于你的问题的答案-如果没有这个名字的员工,delete和select都不会改变数据库中的任何东西,因此回滚是不必要的。

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

票数 1
EN

Stack Overflow用户

发布于 2011-04-30 21:03:55

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5841562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档