.net 实体框架-记录上的读取锁定

.net 实体框架-记录上的读取锁定,.net,entity-framework,entity-framework-4,entity,entity-relationship,.net,Entity Framework,Entity Framework 4,Entity,Entity Relationship,我使用实体框架从不同的应用程序调用相同的数据库。但是,当一个应用程序正在读取/更新记录时,我不希望其他应用程序读取该数据 我尝试了以下示例代码;然而,他们仍然能够读取记录 任何建议或不同的方法将不胜感激 using (Entities context = new Entities(ConnectionString)) { DBTable entity; do { entity = context.DBTable .Where(it

我使用实体框架从不同的应用程序调用相同的数据库。但是,当一个应用程序正在读取/更新记录时,我不希望其他应用程序读取该数据

我尝试了以下示例代码;然而,他们仍然能够读取记录

任何建议或不同的方法将不胜感激

using (Entities context = new Entities(ConnectionString))
{
    DBTable entity;

    do
    {
        entity = context.DBTable
            .Where(item => item.IsLock == false)
            .FirstOrDefault();

        if (entity != null)
        {
            // Map entity to class
            ......


            // Lock the record; it will be unlocked later by a calling method.
            entity.IsLock = true;
            context.SaveChanges();

            count++;
        }

    } while (entity != null && count < 100);
}
使用(实体上下文=新实体(连接字符串))
{
数据库实体;
做
{
entity=context.DBTable
.Where(item=>item.IsLock==false)
.FirstOrDefault();
如果(实体!=null)
{
//将实体映射到类
......
//锁定记录;稍后将通过调用方法将其解锁。
entity.IsLock=true;
SaveChanges();
计数++;
}
}while(实体!=null&&count<100);
}
编辑:基本上,我读一张唱片并做一些事情(有时需要很长时间)。然后使用success/fail标志更新记录(如果失败,其他人可以再次这样做)。我不希望其他应用程序多次成功地执行任务。

从评论改为回答:

如果您不介意用SQL解决这个问题,请创建一个存储过程。在存储过程中,使用UPDLOCK()对记录进行选择。选择后,将记录更新为IsLock。这可防止任何其他进程在检查/设置IsLock字段时读取数据


希望帮助< /P>如果你想在编辑时锁定记录,考虑dBASE。最好检查您的aproach是否真的有必要,这不是正常的做法。如果它运行时间不长,您可以使用TransactionScope。这听起来不像是您希望在其上使用数据库/事务锁的类型-“”(有时需要很长时间)”。我建议您在有问题的表中添加一列-IsLocked,并根据需要更新该列。不过,可能需要一个更复杂的过程(如果某个进程锁定了一条记录,然后该进程以某种方式终止了该过程会怎么样)。为了解决这个问题,考虑一个第二张表,它跟踪你的锁(锁ID,进程ID,期满),然后将锁ID添加到你想要保持未接触的记录中。@我认为问题是,当来自不同应用程序的线程读取相同记录(几乎)的时间完全相同时,锁就不再工作了。如果您不介意用SQL解决这个问题,请创建一个存储过程。在存储过程中,使用UPDLOCK()对记录进行选择。选择后,将记录更新为IsLock。这可防止任何其他进程在检查/设置IsLock字段时读取数据。希望有帮助