这是一种乐观的做法吗?

时间:2012-10-02 06:55:15

标签: sql sql-server sql-server-2008

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

2 个答案:

答案 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