如何处理SQL DB中的乐观并发冲突?

安德鲁·麦克

我正在C#SQL Server上的房地产Windows窗体应用程序上工作,这也是一个多用户应用程序。没有在其中使用Entity Framework或LINQ!

我正在努力如何正确地处理乐观并发冲突假设DB中有两个表,PropertiesAddresses

  • 属性包含一般财产的细节,例如type of propertyno of roomsprice

  • 地址具有属性地址。

加载表单时,它将所有属性信息加载到datagridview在这种情况下,它会将PropertiesAddresses表中的所有信息加载datagridview

用户单击该行上的一行时datagridview,会将该行上的数据加载到编辑表单中。然后,用户更新并更新数据库。在这种情况下,可能会发生乐观并发冲突(OCV)。

但是,如何存储rowversion从属性和地址中获取的数据值,从而有助于处理这种OCV冲突?

最初,我在考虑用户双击该行时,PropertiesAddresses表中rowversions该记录的可以存储在transaction表中但是,在加载记录后,其他用户可以更改值,因此显示的内容可能已过时。因此,当用户单击一行时,我需要将“网格”(不在DB中)的确切数据连同其原始一起发送到编辑表单正确的方法是什么?rowversiondatagridviewrowversion

PS:有人告诉我处理OCV的正确方法是在SQL服务器而不是ADO .NET中处理它,因为OCV是数据库操作。因此,我希望在数据库中处理它的指导!

谢谢

梅赞头

乐观并发应该由数据库处理。例如

CREATE TABLE Customer (
  Id int IDENTITY (1, 1) NOT NULL,
  FirstName nvarchar (256) NULL,
  LastName nvarchar (256) NULL,
  _rowVersion rowversion NOT NULL -- Value generated by SQL Server each time the row is updated
)

加载行时,需要获取SQL Server生成的行版本

SELECT Id, FirstName, LastName, _rowVersion 
FROM Customer

保存行时,必须添加测试以确保从加载行到现在之间RowVersion不变

UPDATE Customer SET
  FirstName = @FirstName,
  LastName] = @LastName,
WHERE Id = @Id AND _rowVersion] = @_rowVersion -- Update using the row version

-- This part can be done in the .NET application if you prefer
SELECT @rowcount = @@ROWCOUNT
IF(@rowcount = 0) -- No row updated => Concurrency Error
BEGIN
    RAISERROR ('Concurrency error in procedure %s', 16, 1, 'Customer_Save')
    RETURN
END

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

dropwizard如何处理并发?

来自分类Dev

如何处理宝石冲突?

来自分类Dev

如何处理SQL中的日期转换错误?

来自分类Dev

如何处理SQL中的重复记录?

来自分类Dev

如何处理pl / sql中的invalid_identifier异常?

来自分类Dev

如何处理SQL查询中的除零错误

来自分类Dev

如何处理SQL中的重复记录?

来自分类Dev

SQL中的ORDER BY如何处理相同的值?

来自分类Dev

如何处理SQL中的日期转换错误?

来自分类Dev

如何处理pl / sql中的invalid_identifier异常?

来自分类Dev

sql中没有返回行时如何处理异常

来自分类Dev

如何处理sql中的除以零错误

来自分类Dev

SoapUI DataSource -> SQL Query 中的垃圾字符,如何处理?

来自分类Dev

在Lua中,如何处理?

来自分类Dev

如何在Azure dll的Azure.Storage.Blobs v12.xx中处理乐观并发

来自分类Dev

Django-如何处理并发?

来自分类Dev

flask如何处理并发请求?

来自分类Dev

如何处理并发风险任务?

来自分类Dev

Nginx乘客如何处理并发请求

来自分类Dev

NodeJS如何处理多核并发?

来自分类Dev

postgres 如何处理并发请求?

来自分类Dev

如何处理XSLT中的处理指令

来自分类Dev

如何处理烧瓶中的多个并发请求

来自分类Dev

ufw如何处理冲突的规则?

来自分类Dev

如何处理冲突的库?-Mathquill与Bootstrap

来自分类Dev

如何处理名称冲突的python包?

来自分类Dev

ECS模式下如何处理冲突?

来自分类Dev

如何处理冲突以响应广播请求?

来自分类Dev

ufw如何处理冲突的规则?