避免对同一个数据库表的并发读取重复
我们有一个包含任务列表的表
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() 包含邮件等)。如果我们将上面的整个代码包装在一个事务中,这是否意味着来自两个不同工作人员的两次调用会导致不重复的记录?
如果workerA首先调用它得到的表,
var recordSetWorkerA = objectontext.recordstable.Where(somecondition...).Where(c => c.IsProcessed == false).Take(10);
如果workerB 在worker A 已经在事务中之后发出调用,以下语句是否会因为试图读取锁定的行或移动到接下来的10 条记录而无法执行?
var recordSetWorkerB = objectontext.recordstable.Where(somecondition...).Where(c => c.IsProcessed == false).Take(10);
有没有我们应该关注的模式。