gpt4 book ai didi

c# - 悲观地锁定进程之间的代码

转载 作者:行者123 更新时间:2023-12-03 04:22:11 24 4
gpt4 key购买 nike

我们有以下可以修改同一数据集的进程:

  • 网站(修改某些父/子数据集的 Asp.NET Web API)
  • Azure Web 作业(修改同一父/子数据集的 C# cod)

当两个进程同时修改父/子数据集时,建议采用哪些方法来确保保持数据完整性(C# Lock 语句不起作用,因为它的代码运行在不同的进程中)。

目前他们正在使用 Entity Framework ,该过程会将数据集加载到内存中,处理数据,然后保存它。问题在于,数据在被进程 B 最初读取后,可能会被其他进程 A 更改。

数据位于 SQL Azure 数据库中。

我可以在父表记录(Id = XXXX)上创建阻塞事务吗,这样其他进程只需等待锁被释放。如何最好地做到这一点?

否则,也许我脑海中浮现的一些其他想法可能是在父记录上设置“锁定”字段,或者检查父 UNION 与每个子表(对于父 ID)的 MAX RowVersion 并检查此每次更改之前和之后的 RowVersion?

最佳答案

sp_getapplock存储过程似乎正是您所需要的。

当您想要同步需要独占访问数据库一部分的进程时,它非常有用。

这应该类似于下面的内容。其中 ctxDbContext,并且您要同步的每个进程都使用相同的共享逻辑名称字符串“MYLOCKNAME”,或您想要的任何内容。

using (var tran = ctx.Database.BeginTransaction())
{
try
{
const string lockName = "MYLOCKNAME";

var resourceParam = new SqlParameter("Resource", SqlDbType.NVarChar, 255) { Value = lockName };
var lockModeParam = new SqlParameter("LockMode", SqlDbType.NVarChar, 32) { Value = "Transaction" };
ctx.Database.ExecuteSqlCommand("EXEC sp_getapplock @Resource, @LockMode", resourceParam, lockModeParam);

// Do stuff with ctx
// ...

tran.Commit();
}
catch
{
tran.Rollback();
}
}

关于c# - 悲观地锁定进程之间的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47625559/

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