Linq to sql 如何使用LINQtoSQL进行事务性选择和更新?

Linq to sql 如何使用LINQtoSQL进行事务性选择和更新?,linq-to-sql,select,transactions,Linq To Sql,Select,Transactions,我需要选择一组包含IsLocked字段的记录。然后,我需要在事务中立即将IsLocked值从false更新为true,这样其他程序就不会获取那些已经获取的记录进行处理,而是可以获取其他未锁定的记录 这是我到目前为止的代码。这是正确的吗?我该如何更新?访问foreach中的每条记录,更新值,然后提交更改()?似乎当我运行下面的代码时,我丢失了与电子邮件相关联的集合,因此无法执行我需要执行的处理。提前关闭事务是否会导致丢失加载的记录 要关注以下问题:如何在事务中加载和更新记录,请关闭事务以不锁定超过

我需要选择一组包含IsLocked字段的记录。然后,我需要在事务中立即将IsLocked值从false更新为true,这样其他程序就不会获取那些已经获取的记录进行处理,而是可以获取其他未锁定的记录

这是我到目前为止的代码。这是正确的吗?我该如何更新?访问foreach中的每条记录,更新值,然后提交更改()?似乎当我运行下面的代码时,我丢失了与
电子邮件相关联的集合,因此无法执行我需要执行的处理。提前关闭事务是否会导致丢失加载的记录

要关注以下问题:如何在事务中加载和更新记录,请关闭事务以不锁定超过需要的时间,处理记录,然后将后续更改保存回数据库

using (ForcuraDaemonDataContext ctx = new ForcuraDaemonDataContext(props.EmailLogConnectionString))
{
    System.Data.Common.DbTransaction trans = null;
    IQueryable<Email> emails = null;
    try
    {
        // get unlocked & unsent emails, then immediately lock the set for processing
        ctx.Connection.Open();
        trans = ctx.Connection.BeginTransaction(IsolationLevel.ReadCommitted);
        ctx.Transaction = trans;

        emails = ctx.Emails.Where(e => !(e.IsLocked || e.IsSent));
        /// ???
        ctx.SubmitChanges();

        trans.Commit();
    }
    catch (Exception ex)
    {
        if (trans != null)
            trans.Rollback();

        eventLog.WriteEntry("Error. Could not lock and load emails.", EventLogEntryType.Information);
    }
    finally
    {
        if (ctx.Connection.State == ConnectionState.Open)
            ctx.Connection.Close();
    }


    // more stuff on the emails here

}
使用(ForcuraDaemonDataContext ctx=new ForcuraDaemonDataContext(props.EmailLogConnectionString))
{
System.Data.Common.DbTransaction trans=null;
IQueryable电子邮件=空;
尝试
{
//获取未锁定和未发送的电子邮件,然后立即锁定集合以进行处理
ctx.Connection.Open();
trans=ctx.Connection.BeginTransaction(IsolationLevel.ReadCommitted);
交易=交易;
emails=ctx.emails.Where(e=>!(e.IsLocked | | e.IsSent));
/// ???
ctx.SubmitChanges();
trans.Commit();
}
捕获(例外情况除外)
{
如果(trans!=null)
trans.Rollback();
eventLog.WriteEntry(“错误。无法锁定和加载电子邮件。”,EventLogEntryType.Information);
}
最后
{
if(ctx.Connection.State==ConnectionState.Open)
ctx.Connection.Close();
}
//这里有更多关于电子邮件的内容
}
请参阅,以获得类似、更简单问题的答案。

请参阅,以获得类似、更简单问题的答案