何时在SQL Server中使用事务

Chi*_*isu 22 t-sql transactions try-catch

关于如何使用交易有很多很多问题.我想知道的是何时?在什么情况下?什么类型的查询?Try-Catch块可以代替吗?等等...

我设计了一个包含~20个表和~20个存储过程的数据库.目前我的SP中没有一个使用事务,但整个过程中有许多Try-Catch块.原因是因为每当我试图将它们包装在一个事务中时,SP就会停止运行,我最终会丢失数据并且比我使用Trans更糟糕.

再说......

  1. 何时是使用交易的适当时机?
  2. 作为后续问题,如果我使用它们,我怎么能以这样的方式使用它们,以便仅防止其他SP同时访问相同的数据以防止损坏而不是导致我的SP无法在所有?

这是我为重命名产品而写的一个小样本SP:

CREATE PROCEDURE spRenameProduct
    @pKey int = NULL,
    @pName varchar(50)
AS
BEGIN
    BEGIN TRY
        IF LTRIM(RTRIM(@pName)) = '' SET @pName = NULL
        IF NOT @pKey IS NULL AND NOT @pName IS NULL BEGIN
            declare @pKeyExisting int = (select MIN(ID) from rProduct where Product like @pName and not ID = @pKey)
            IF @pKeyExisting is null BEGIN
                update rProduct set IsValid = 1, Product = @pName where ID = @pKey
            END ELSE BEGIN
                update Request set ProductID = @pKeyExisting where ProductID = @pKey
                update StatusReport set ProductID = @pKeyExisting where ProductID = @pKey
                delete from rProduct where ID = @pKey
            END
        END
    END TRY BEGIN CATCH END CATCH
END
Run Code Online (Sandbox Code Playgroud)

现在如果两个人在同一时间使用它会怎么样?我真的不想,也没有时间(不幸的是),想要开心.在这种情况下,KISS是最好的.:)

Ode*_*ded 41

当您正在进行的数据库操作集需要是原子时,您可以使用事务.

那就是 - 他们都需要成功失败.介于两者之间.

事务将用于确保数据库始终处于一致状态.

通常,除非有充分的理由不使用它们(例如长时间运行的过程),否则请使用它们.有关详细信息,请参阅此博文.


Try/Catch块与事务无关 - 它们用于异常处理.这两个概念无关,也不是彼此的替代.

  • +1和**否**-“ try ... catch”块不能“ **”足以替代交易...。 (2认同)
  • @Chiramisu - 正如我在链接的博客文章中所说,"如果有疑问,请使用交易". (2认同)