0

在 SQL Server 内存优化表中,rowversion不允许使用该数据类型。

在我的应用程序中,我仍然希望能够检测到并发冲突,其中用户 A 打开一个项目进行编辑,用户 B 打开同一个项目,用户 A 保存并且用户 B 保存而没有看到用户 A 的更改。多年来,我一直rowversion为此使用一个专栏。管理我自己的假rowversion专栏有什么建议?

4

2 回答 2

1

您没有提及您使用的前端语言,但这是我对 c# 数据集和“使用乐观并发”选项的经验的提示

当您将一行下载到 DataTable 中时,dt 会跟踪它下载的原始值:

SELECT id, name, age, address FROM person

--> 1, Jon, 33, null

您进行更新:

dt[0].Name = "Paul"

该行现在跟踪两个值,原始 (Jon) 和当前 (Paul)

将更新发送回数据库,它会运行如下查询:

UPDATE person 
SET name = @currentName 
WHERE id = @originalID and 
 (Name = @originalName or (@originalName is null AND name is null)) AND 
 ...

如此有效:

UPDATE person 
SET name = 'Paul'
WHERE id = 1 and 
 (Name = 'John' or ('John' is null AND name is null)) AND...

这样可以检测到已被外国客户端更改/无效/非无效的数据

使用具有此功能的语言的 ORM 可能是最简单的

-

ps:也许一个更简单的概念是添加一个 int 列和一个触发器来增加它。不过,对于大多数人来说,以这种方式添加一个纯粹用于信息控制的列,而不是对存储实体的某些真实世界数据方面进行建模,可能并不适合大多数人

于 2017-12-30T22:34:08.737 回答
0

内存优化表子系统具有对乐观并发的内置支持。

内存优化表的事务

错误代码:41302

描述:试图更新自当前事务开始以来在不同事务中更新的行。

原因:如果两个并发事务尝试同时更新或删除同一行,则会出现此错误情况。两个事务之一收到此错误消息,需要重试。

对于其他场景,例如“在 CRM 中打开客户帐户”情况,您仍然可以使用老式方法,例如手动应用行版本号,然后将其插入谓词中。

例如:

UPDATE
 [MyTable]
SET
 [Col001] = 'SomeVal'
WHERE
 PK = @primaryKey
 AND [RowVersionColumn] = @rowVersionStashedFromSelect
于 2018-05-02T12:44:18.073 回答