在SQL Server内存优化表中,不允许rowversion
数据类型。
在我的应用程序中,我仍然希望能够检测并发冲突,其中用户A打开要编辑的项目,用户B打开相同的项目,用户A保存并且用户B保存而不会看到用户A的更改。多年来我一直使用rowversion
列。管理我自己的假rowversion
列的建议是什么?
答案 0 :(得分: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列和一个触发器来递增它。但是,对于大多数人来说,它可能并不适合,以这种方式添加纯粹用于信息控制的列,而不是对存储实体的某些现实世界数据方面进行建模
答案 1 :(得分:0)
Memory-Optimized表子系统内置了对乐观并发的支持。
Transactions with Memory-Optimized Tables
错误代码:41302
描述:尝试更新一行 自现在开始以来在不同的交易中更新 事务。
原因:如果两个并发,则会出现此错误情况 事务尝试同时更新或删除同一行 时间。两个事务中的一个收到此错误消息并将 需要重试。
对于其他方案,例如“在CRM中打开客户帐户”的情况,您仍然可以使用旧式的方式,例如手动应用的行版本号,您可以将其粘贴到谓词中。
例如:
UPDATE
[MyTable]
SET
[Col001] = 'SomeVal'
WHERE
PK = @primaryKey
AND [RowVersionColumn] = @rowVersionStashedFromSelect