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
}