在乐观方法的示例中,@ version(例如作为过程中的参数)始终是已知的。 是否可以在程序中接收@version以及它可以影响什么。 程序的一部分:
CREATE PROCEDURE [dbo].[UpdateTestTable2]
...
SELECT @version = [version]
FROM dbo.TestTable2
WHERE Id = @Id
BEGIN TRANSACTION
UPDATE dbo.TestTable2
SET testName = @testName
WHERE Id = @Id AND [version] = @version
...
答案 0 :(得分:3)
“版本”需要来自应用程序并反映已选择进行更新的记录版本。然后将此信息作为更新的一部分包括在内,以确保更新正在“查看”的记录的相同版本。
通过从外部提供一些信息(在本例中为@id),您似乎正在做的事情。但是,正如Igor所指出的那样,名为“version”的列没有任何魔力:你可以放弃你的第一个选择并使用@id离开过滤器。
但是......你缺少的是同时更新版本/ id字段。你应该做这样的smoething:
update testtable2
set versioning_column += 1
where versioning_column = @versioning_column
这样,您正在更新您想要的列,但同时通过更改版本标记阻止其他人这样做。
答案 1 :(得分:0)
实现乐观并发的一种简单方法是在读取数据时计算哈希值,然后在保存新数据之前对表重新计算此值:如果哈希值不同,则在读取和写入操作之间修改表。
CREATE TABLE #TMP(name VARCHAR(10), age TINYINT);
INSERT #TMP VALUES ('Ann', 10);
INSERT #TMP VALUES ('Ann', 10);
INSERT #TMP VALUES ('Ann', 20);
INSERT #TMP VALUES ('Beth', 10);
SELECT *, CHECKSUM(*) AS [hashvalue] FROM #TMP
-- name age hashvalue
-- ---------- ---- -----------
-- Ann 10 940063178
-- Ann 10 940063178
-- Ann 20 940063188
-- Beth 10 1206720504