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