gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:03:52 25 4
gpt4 key购买 nike

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

我正在为如何正确处理乐观并发冲突而苦苦挣扎。假设数据库中有两个表,PropertiesAddresses

  • Properties 包含一般属性详细信息,例如 type of
    属性
    房间数价格

  • Addresses 具有属性地址。

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

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

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

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

P.S. 有人告诉我处理 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

关于c# - 如何处理 SQL DB 中的乐观并发冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25121651/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com