并发避免重复读取过同一个数据库表并发避免重复读取过同一个数据库表
我们有一个包含任务列表
Table RecordsTable
RecordID
RecordName
...
...
IsProcessed
多个工作机器读出的表表,一旦任务处理完成,标记IsProcessed为真。
因此,如果我们希望下面的代码没有重复工作,在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发出呼叫之后工作者来说已经是该交易将以下statment无法执行,因为试图读取锁定行 或移动到下一个10条记录?
var recordSetWorkerB = objectontext.recordstable.Where(somecondition...).Where(c => c.IsProcessed == false).Take(10);
有没有我们应该看的任何模式。
简而言之:您将需要用于检索任务的存储过程,因为这需要手写SQL来确保只有一个工作人员将加载这些记录并将其切换到原子操作中的“处理”状态(如答案中所述) 。 – 2012-07-29 16:30:18