我有一个存储过程可以删除多个表中的记录。 我希望所有的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
仅适用于读取操作,这是真的吗?
答案 0 :(得分:1)
您要保证的是,要么成功删除与两个表中的条件匹配的所有行,要么删除所有行(即,如果存在问题,则会删除删除。)有更多的锁和它们保留较长时间,但如果失败,则不必手动重新创建删除行自动撤消的行。您可能想要添加语句:
set xact_abort on
在事务开始时将整个事件包装在begin try / begin catch语句中。
请参阅sommarskog.se/error-handling-I.html#XACT_ABORT,以便对此声明和TSQL的错误处理进行详尽的讨论。