我最近实现了SQLrowversion
以防止我的系统中出现并发问题。我用rowversion
更新表中的单行时在 where 子句中。到目前为止,我已经测试过,似乎是一个很好的解决方案。现在我正在寻找一种简单的方法来在我的系统中实现此功能。这是当用户想要更新记录时运行的 SP:
CREATE PROCEDURE [dbo].[UpdateBuilding]
@Status BIT = NULL,
@Name VARCHAR(50) = NULL,
@Code CHAR(2) = NULL,
@OriginalRowVersion ROWVERSION
AS
SET NOCOUNT ON
SET XACT_ABORT ON
BEGIN
UPDATE dbo.Building
SET Status = @Status,
Name = @Name,
Code = @Code,
ActionDt = CURRENT_TIMESTAMP
WHERE RowVersion = @OriginalRowVersion
IF @@ROWCOUNT = 0
BEGIN
RAISERROR('Buildingwith code %s was modified or deleted by another user.', 16, 1, @Code);
END;
END;
如果我想执行上面的 SP,我需要传递所需的参数。这就是我在 SQL Management Studio 中调用 SP 的方式:
EXEC UpdateBuilding
@Status = 1,
@Name = "Rockefeller Center",
@Code = 436,
@OriginalRowVersion = 0x0000000000006955;
现在我开始研究如何在我的系统中实现这一点,我使用 ColdFusion 与数据库进行通信。以下是如何使用 CF 2016 执行此过程的示例:
<cfstoredproc procedure="UpdateBuilding" datasource="#dsn#">
<cfprocparam dbvarname="@Status" value="#trim(arguments.status)#" cfsqltype="cf_sql_bit" />
<cfprocparam dbvarname="@Code" value="#trim(arguments.code)#" cfsqltype="cf_sql_char" maxlength="2" null="#!len(trim(arguments.code))#" />
<cfprocparam dbvarname="@Name" value="#trim(arguments.name)#" cfsqltype="cf_sql_varchar" maxlength="50" null="#!len(trim(arguments.name))#" />
<cfprocresult name="Result"/>
</cfstoredproc>
您可以看到所有值都与用户在表单中提交的参数一起传递。然而,更新基于PK
值(在我的例子中是代码列)非常简单。现在我有了二进制值,这让一切变得更加复杂。首先我使用 JSON 将数据发送到客户端。发送rowversion
在 JSON 对象中需要将该值转换为binary
然后当用户提交表单时转换回来。我想知道是否有更好的方法来实现这一目标?理想情况下我什至不会发送rowversion
给用户侧带来价值。我会将其保留在后端,一旦用户提交基于 PK 的表单拉取行版本值,然后调用存储过程。如果有人知道处理这种情况的好方法,请告诉我。我没用过rowversion
以前,这对我来说是新的。