我们有以下可以修改同一数据集的流程:
当两个进程同时修改父/子数据集时,有哪些建议的方法可以确保我们保持数据完整性(C#Lock语句不起作用,因为它的代码在不同的进程中运行)。
目前他们正在使用Entity Framework,该流程将数据集加载到内存中,处理数据,然后保存。问题是在进程B最初读取数据之后,数据可能会被其他进程A更改。
数据位于SQL Azure数据库中。
我可以在父表记录(Id = XXXX)上创建阻塞事务,因此其他进程只需要等到锁被释放。怎么做到最好?
否则,也许我的头脑中的其他一些想法可能是在父记录上设置“已锁定”字段,或者使用每个子表(对于父ID)检查父UNION的MAX RowVersion并检查此每次更改之前和之后的RowVersion?
答案 0 :(得分:0)
sp_getapplock存储过程似乎正是您所需要的。
当您想要同步需要获得对数据库的一部分的独占访问权限的进程时,它非常有用。
这应该是类似下面的内容。其中ctx
是DbContext
,并且您要同步的每个进程都使用相同的共享逻辑名字符串" 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();
}
}