Linq to SQL:锁定表项

时间:2015-03-23 11:55:54

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

我有几个应用程序实例(.Net),它们使用相同的表。 每个应用程序实例都接受DataBase表中的第一个条目,并更改" Pending"中的条目状态(表中的附加行)。在该应用程序启动第三方系统中的更新数据之后,处理"处理" 我如何实现我的逻辑,以确保第二个实例不会采取这个"等待"进入同一时间? 我正在使用Linq To Sql方法,并希望避免DataBase中具有相同数据库条目的冲突。

1 个答案:

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