2011-08-09 5 views
2

IsLockedフィールドを含む一連のレコードを選択する必要があります。トランザクション内でIsLockedの値をfalseからtrueに直ちに更新する必要があります。そのため、他のプログラムは処理済みのレコードをフェッチしませんが、他のロックされていないレコードをフェッチできます。Linq-To-SQLを使用してトランザクションを選択して更新する方法は?

これまでのコードは次のとおりです。これは正しいです?そして、私はどのように更新を行うのですか? foreach内の各レコードにアクセスし、値を更新してSubmitChanges()を更新しますか?以下のコードを実行すると、emailsに関連付けられたコレクションが失われてしまい、処理ができないようです。トランザクションを早期に終了すると、ロードされたレコードが失われますか?

トランザクションのロードと更新の記録はどのようにして、必要以上にロックしないようにトランザクションをクローズし、レコードを処理してから、データベースに後続の変更を保存します。

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 

} 

答えて

0

類似した、より簡単な形式の問題の答えは、this questionを参照してください。

関連する問題