gpt4 book ai didi

c# - Entity Framework 的悲观并发

转载 作者:太空狗 更新时间:2023-10-30 01:02:48 24 4
gpt4 key购买 nike

在我的项目中,用户将能够根据需要编辑一些数据集。但是,由于项目规范,一次只能一个用户编辑某个数据集/访问该数据集的编辑页面。所以如果用户A正在编辑数据集1用户B一定不能访问数据集1<的编辑页面/strong> 只要用户 A 位于该页面,反之亦然。

我读了一些书,悲观并发似乎是我要找的东西,页面被“锁定”在该页面内的用户离开之前,这解释了我的标题。

总的来说,我对 ASP.NET 和 Web 开发还很陌生。我想问一下我是否正朝着正确的方向来解决我的问题,我如何在我的项目中实现它(我只一直看到乐观并发的示例)以及是否还有其他我没有遇到过的方法,解决我的问题。

最佳答案

首先我想说你的问题是关于数据库和 EF,而不是 ASP.NET MVC。顺便说一句,有两种基本类型的并发控制:

悲观并发,它在用户请求的时间和他保存更改的时间之间锁定数据,以便其他用户无法在此期间保存更改相同的数据。

开放式并发,它不锁定任何东西并假设第二个用户尝试更改数据不会与第一个用户保存的更改冲突,但如果有冲突,第二个用户的更改是已中止,仅保留第一个用户的更改。
EF 不直接支持悲观并发。

所以我认为对您来说最好的选择是 EF 支持的乐观并发,正如您可能知道的那样,它通过检查更新前和更新后的数据来确定用户 B 是否在用户 A 检索它之间修改了它并更新了它。如果它改变了,那么用户 A 的修改被丢弃,如果没有,那么用户 A 的修改被更新到数据库中。

要实现开放式并发,您可以简单地定义一个 RowVersion您模型的属性:

public byte[] RowVersion { get; set; }

并且在您的模型配置中,您应该告诉 EF 它在属性中具有行版本的行为:

Property(p => p.RowVersion).IsRowVersion();

现在如果用户 A 检索数据,并且用户 B 检索相同的数据并且用户 B 在用户 A 保存他的更改之前保存更改,则用户 A 的更改将被丢弃并抛出异常:

Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh YourModelName entries.

More info .

关于c# - Entity Framework 的悲观并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32335266/

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