有很多问题是关于如何使用事务的,但我想知道的是何时使用它?在什么情况下使用?适用于哪些查询类型?是否可以仅使用Try-Catch块?等等...
我设计了一个包含约20个表和20个存储过程的数据库。目前,我的所有存储过程都没有使用事务,但是其中有许多Try-Catch块。原因是每次尝试将它们包装在一个事务中时,存储过程将停止运行,我将遗失数据,比起不使用事务要更糟。
所以再次提问...
- 何时使用事务是合适的?
- 作为跟进问题,如果我使用了事务,如何使用它们以仅防止其他存储过程同时访问相同的数据,以避免损坏而不是导致我的存储过程完全无法运行?
这是我写的一个重命名产品的小样例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
现在如果有两个人同时使用这个,会怎么样呢?我真的不想也没有时间(不幸的是)变得很复杂。在这种情况下,简单易行是最好的选择 :)