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

时间:2017-12-30 22:15:48

标签: sql-server memory-optimized-tables in-memory-oltp

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

在我的应用程序中,我仍然希望能够检测并发冲突,其中用户A打开要编辑的项目,用户B打开相同的项目,用户A保存并且用户B保存而不会看到用户A的更改。多年来我一直使用rowversion列。管理我自己的假rowversion列的建议是什么?

2 个答案:

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