Я недавно внедрил SQL rowversion
для предотвращения проблем параллелизма в моей системе. Я использую 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 выше, мне нужно будет передать необходимые параметры. Вот как я называю SP в SQL Management Studio:
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
раньше, и это ново для меня.