【问题标题】:Linq to SQL: Lock on table entryLinq to SQL:锁定表条目
【发布时间】:2015-03-23 11:55:53
【问题描述】:

我有几个应用程序 (.Net) 实例,它们使用同一个表。 每个应用程序实例获取数据库表中的第一个条目,并将条目的状态(表中的附加行)从“待处理”更改为“处理中”,之后该应用程序开始更新第 3 方系统中的数据。 如何实现我的逻辑以确保第二个实例不会同时采用此“待定”条目? 我正在使用 Linq To Sql 方法,并希望避免在数据库中与相同的数据库条目发生冲突。

【问题讨论】:

    标签: c# .net linq-to-sql sql-server-2012


    【解决方案1】:

    首先,您需要获取第一个未锁定的条目并将其锁定以向其他实例发出信号,表明其他人正在处理该实例。 之后,在不相关的表上执行您需要的操作,并在您完成解锁实例时。整体代码应如下所示:

    var instance = db.Entities.FirstOrDefault(e => e.Status == "Pending");
    instance.Status = "Processing";
    // Save changes so the other clients can see that this row is locked
    db.SaveChanges();
    // Perform custom logic
    // And mark the instance as finished
    db.Table<Entity>().Attach(instance);
    instance.Status = "Finished";
    db.SaveChanges();
    

    编辑

    为了避免多个应用程序在第一次获取相同的实例,您需要将查询和更新包装到一个事务中。这样,所有其他应用程序将在获得结果之前等待事务提交:

    Entity instance;
    using(var scope = new TransactionScope())
    {
        instance = db.Entities.FirstOrDefault(e => e.Status == "Pending");
        instance.Status = "Processing";
        db.SaveChanges();
        scope.Complete();
    }
    

    【讨论】:

    • 谢谢。我已经完全按照您的建议实施了。但我想知道是否可能是多个应用程序同时尝试更新条目状态。
    • 谢谢。而且,是否可以使用集成测试来涵盖此功能?我希望确保多个应用程序不会同时使用相同的条目。
    • 是的,当然。只需同时提出两个或更多请求。
    猜你喜欢
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多