同じデータベース テーブルからの同時読み取りでの重複の回避
タスクのリストを含むテーブルがあります
Table RecordsTable
RecordID
RecordName
...
...
IsProcessed
複数のワーカー マシンがテーブルから読み取り、タスクが処理されると IsProcessed を true としてマークします。
したがって、次のコードを重複せずに機能させたい場合
C# の疑似コード
//get first 10 records that are not processed based on some other conditions
var recordSet = objectontext.recordstable.Where(...).Where(c => c.IsProcessed == false).Take(10);
//loop through the recordset in a transaction
foreach(record singleRecord in recordSet)
{
bool result = ProcessRecord();
//Mark isProcessed as true
if(result)
singleRecord.IsProcessed = true;
objectContext.Savechanges();
}
レコードの重複処理を回避したい (ProcessRecords() にはメーラーなどが含まれているため)。上記のコード全体をトランザクションでラップすると、2 つの異なるワーカーからの 2 つの呼び出しが重複しないレコードになるということですか?
workerA が最初に取得したテーブルへの呼び出しを発行すると、
var recordSetWorkerA = objectontext.recordstable.Where(somecondition...).Where(c => c.IsProcessed == false).Take(10);
ワーカー A が既にトランザクションに参加している後にワーカー B が呼び出しを発行した場合、次のステートメントは実行に失敗しますか?
var recordSetWorkerB = objectontext.recordstable.Where(somecondition...).Where(c => c.IsProcessed == false).Take(10);
注目すべきパターンはありますか。