我有几个应用程序实例(.Net),它们使用相同的表。 每个应用程序实例都接受DataBase表中的第一个条目,并更改" Pending"中的条目状态(表中的附加行)。在该应用程序启动第三方系统中的更新数据之后,处理"处理" 我如何实现我的逻辑,以确保第二个实例不会采取这个"等待"进入同一时间? 我正在使用Linq To Sql方法,并希望避免DataBase中具有相同数据库条目的冲突。
答案 0 :(得分:2)
首先,您需要锁定第一个未锁定的条目并将其锁定,以便向其他实例发出其他实例的信号。 然后,在不相关的表上执行所需的操作,以及在您完成解锁实例后。整体代码应如下所示:
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();
}