2017-06-14 42 views
1

我有一个从多个表中删除记录的存储过程。 我希望所有的删除语句都能成功完成,否则无。这里的实际目的是擦除与特定用户相关的所有数据。对一批删除语句使用T-SQL Transaction?

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

所以我把它包在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 

这里我的问题是什么包装删除多在调用的影响交易?它会创建可能的死锁场景,还是以某种方式损害性能?

从我正在阅读的文章中,使用TRANSACTION ISOLATION LEVEL仅适用于读取操作,这是真的吗?

+1

不确定'END TRANSACTION'是什么。 [TSQL具有交易的COMMIT或ROLLBACK](https://stackoverflow.com/a/14806566/4416750)。 –

+0

你可能想要在try/catch中包装它。否则,它不会做任何事情,而只是将表格锁定一段时间。交易有一个小的开销,但它很小,除非交易很大。 –

+0

@LewsTherin是的,这是错字。它是固定的 –

回答

1

你所保证的是,或者所有匹配两个表中的条件的行都被成功删除,或者没有行被删除(即,如果有问题,则删除将被回滚)。它们会保留更长时间,但如果失败,则不必手动重新创建删除行自动取消的行。您可能需要添加以下语句:

set xact_abort on 

在事务开始时并将所有内容包装在begin try/begin catch语句中。

请参阅sommarskog.se/error-handling-I.html#XACT_ABORT了解有关此语句和TSQL错误处理的详尽讨论。

+0

是的我知道一个交易的原子行为,这里的问题是有什么考虑使用交易。从你的回答看来,你听起来像是在说有额外的锁,所以可能会有更多的开销? –

+0

是的,有更多的开销。所以如果你需要整体回滚,整个事情应该在一个事务中。 –

+0

在2008 SQL Server后可能会忽略nolock,这是一个非常糟糕的主意。请参阅由Aron Bertrand撰写的文章:https://www.mssqltips.com/sqlservertip/3172/avoid-using-nolock-on-sql-server-update-and-delete-statements/ –