对批量删除语句使用 T-SQL 事务?
Use T-SQL Transaction for batch of delete statements?
我有一个从多个表中删除记录的存储过程。
我希望所有删除语句都成功完成,或者 none。这里的实际目的是擦除与特定用户相关的所有数据。
请注意,此数据的 none 以任何方式与任何其他数据相关。例如。一个用户的数据不会以任何方式被另一个用户的数据引用。但是,可以让并发客户端源同时访问一个用户的数据。我不知道这是否相关
所以我把它包装在 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
仅适用于读取操作,这是真的吗?
您要保证的是,要么成功删除两个表中符合条件的所有行,要么删除 none 行(即,如果出现问题,删除将回滚。)有更多的锁,它们会保留更长的时间,但如果失败,您不必手动重新创建行,删除会自动为您撤消。您可能想要添加语句:
set xact_abort on
在交易开始时将整个事情包装在 begin try/begin catch 语句中。
请参阅 sommarskog.se/error-handling-I.html#XACT_ABORT 以获得关于此语句和 TSQL 错误处理的精彩讨论。
我有一个从多个表中删除记录的存储过程。 我希望所有删除语句都成功完成,或者 none。这里的实际目的是擦除与特定用户相关的所有数据。
请注意,此数据的 none 以任何方式与任何其他数据相关。例如。一个用户的数据不会以任何方式被另一个用户的数据引用。但是,可以让并发客户端源同时访问一个用户的数据。我不知道这是否相关
所以我把它包装在 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
仅适用于读取操作,这是真的吗?
您要保证的是,要么成功删除两个表中符合条件的所有行,要么删除 none 行(即,如果出现问题,删除将回滚。)有更多的锁,它们会保留更长的时间,但如果失败,您不必手动重新创建行,删除会自动为您撤消。您可能想要添加语句:
set xact_abort on
在交易开始时将整个事情包装在 begin try/begin catch 语句中。
请参阅 sommarskog.se/error-handling-I.html#XACT_ABORT 以获得关于此语句和 TSQL 错误处理的精彩讨论。