Sql server SQL Server内存优化表检测并发冲突

Sql server SQL Server内存优化表检测并发冲突,sql-server,memory-optimized-tables,in-memory-oltp,Sql Server,Memory Optimized Tables,In Memory Oltp,在SQL Server内存优化表中,不允许使用行版本数据类型 在我的应用程序中,我仍然希望能够检测并发冲突,其中用户a打开一个项目进行编辑,用户B打开同一个项目,用户a保存,用户B保存,而不查看用户a的更改。多年来,我一直在使用rowversion专栏。管理我自己的伪rowversion专栏的建议是什么?您没有提到您使用的前端语言,但以下是我使用c#的数据集和“使用乐观并发”选项的经验提示 当您将一行下载到数据表中时,dt将跟踪其下载的原始值: SELECT id, name, age, add

在SQL Server内存优化表中,不允许使用
行版本
数据类型


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

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

当您将一行下载到数据表中时,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列和一个触发器来增加它。不过,大多数人可能不太喜欢这样添加一个列,它纯粹是为了以这种方式进行信息控制,而不是为存储实体的某些真实数据方面建模。内存优化表子系统内置了对乐观并发的支持

错误代码:41302

描述:试图更新已删除的行 从当前开始在不同的事务中更新 交易

原因:如果两个并发的 事务试图同时更新或删除同一行 时间两个事务中的一个收到此错误消息并将 需要重试

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

例如:

UPDATE
 [MyTable]
SET
 [Col001] = 'SomeVal'
WHERE
 PK = @primaryKey
 AND [RowVersionColumn] = @rowVersionStashedFromSelect

为此目的使用您自己的标识列怎么样?扩展WHERE子句,以便也传入所有旧值。如果更新影响0行,则该行必须已被其他客户端更改,因为您下载了“旧”值。int列的替代项是一个简单的datetime2列,记录行更改(或创建)的日期和时间。略为有用的信息。