对批量删除语句使用T-SQL事务?

时间:2017-06-14 19:25:31

标签: sql sql-server tsql transactions sql-server-2016

我有一个存储过程可以删除多个表中的记录。 我希望所有的delete语句都能成功完成,或者没有。这里的实际目的是擦除与特定用户相关的所有数据。

请注意,这些数据都不会以任何方式与任何其他数据相关。例如。另一个用户数据不会以任何方式引用用户的数据。但是,可以使并发客户端源同时访问一个用户的数据。我不知道这是否相关

所以我把它包装在BEGIN TRANSACTION ... COMMIT TRANSACTION

中 像这样:

CREATE PROCEDURE [dbo].[spDeleteData]
    @MyID AS INT
AS
    BEGIN TRANSACTION
        DELETE FROM [Table1] WHERE myId = @MyID;
        DELETE FROM [Table2] WHERE myId = @MyID;
        ....
    COMMIT TRANSACTION
RETURN 0

我的问题是在事务中包装多个DELETE调用的含义是什么?它是否会创建可能的死锁场景,或以某种方式损害性能?

从我正在阅读的内容来看,使用TRANSACTION ISOLATION LEVEL仅适用于读取操作,这是真的吗?

1 个答案:

答案 0 :(得分:1)

您要保证的是,要么成功删除与两个表中的条件匹配的所有行,要么删除所有行(即,如果存在问题,则会删除删除。)有更多的锁和它们保留较长时间,但如果失败,则不必手动重新创建删除行自动撤消的行。您可能想要添加语句:

 set xact_abort on

在事务开始时将整个事件包装在begin try / begin catch语句中。

请参阅sommarskog.se/error-handling-I.html#XACT_ABORT,以便对此声明和TSQL的错误处理进行详尽的讨论。