0

在乐观方法的示例中,@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
...
4

2 回答 2

3

“版本”需要来自应用程序并反映已选择更新的记录的版本。然后将此信息作为更新的一部分包含在内,以确保更新正在“查看”的记录的相同版本。

通过从外部提供一些信息(在本例中为@id),这似乎是您正在做的事情。但是,正如 Igor 所指出的,名为“版本”的列并没有什么神奇之处:您可以放弃您的第一个选择并使用@id 离开过滤器。

但是......您缺少的是版本/id 字段的同时更新。你应该这样做:

update testtable2
set versioning_column += 1
where versioning_column = @versioning_column

这样,您将准确地更新您打算更新的列,但同时通过更改版本标记来阻止其他任何人这样做。

于 2012-10-02T07:56:00.017 回答
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
于 2012-10-02T09:05:22.877 回答