[英]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.