在进程

时间:2017-12-04 02:10:37

标签: c# entity-framework azure azure-webjobs

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

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

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

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

数据位于SQL Azure数据库中。

我可以在父表记录(Id = XXXX)上创建阻塞事务,因此其他进程只需要等到锁被释放。怎么做到最好?

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

1 个答案:

答案 0 :(得分:0)

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();
    }
}