繁体   English   中英

Linq to SQL:锁定表条目

[英]Linq to SQL: Lock on table entry

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM