我有一個分佈式客戶端服務器系統,它有多個'工作'引擎和一個WCF服務,我們可以稱之爲FileManagerService
,它將'作業'添加到數據庫'工人'發動機來接受和處理。如何在LINQ中實現數據庫記錄互斥sql
數據庫由兩個表組成:Jobs
和File
。每項工作都以File
(多對一關係)運作。可以一次將多個作業添加到Jobs
表中,它們按照隊列的方式進行處理。
Job
的是操作,例如:MoveFile或的DeleteFile等
我試圖通過使用來實現對File
記錄互斥‘在File
表本身鎖定’(布爾)列。
我認爲需要的互斥區域在WCF服務FileManagerService
的方法:addJob()
以及'工作'引擎'TakeAndProcessAJob()
內。
目前我遇到了linq-to-sql延遲執行以及linq-to-sql事務系統如何工作的問題。
目前,我有以下方法,應該從Jobs
表採取Job
,檢查其相關File
被鎖定,如果被鎖定,我們將返回任何結果,如果它沒有被鎖定,我們將鎖定File
和返回Job
,並從Jobs
隊列中刪除Job
:
public static Job GetAnAvailableJob()
{
using (DBDataContext db = new DBDataContext())
{
DataLoadOptions loadOptions = new DataLoadOptions();
loadOptions.LoadWith<Job>(f => f.File);
db.LoadOptions = loadOptions;
var jobAvailable = from ja in db.Jobs
where ja.File.locked == false
select ja;
var jobToTake = jobAvailable.FirstOrDefault();
// This file temp is here so that we can return
// an associated File with the Job.
// We delete
File fileTemp = null;
if (jobToTake != null)
{
fileTemp = jobToTake.File;
jobAvailable.File.locked = true;
Console.WriteLine("Locked file:" + fileTemp.FileID);
db.Jobs.DeleteOnSubmit(jobToTake);
db.SubmitChanges();
jobToTake.Asset = fileTemp;
}
return jobToTake;
}
}
的「工人」引擎TakeAndProcessAJob()
基本上具有下列功能:呼叫GetAnAvailableJob()
,如果返回的對象不爲空 - > proccess的工作,如果是空 - >睡覺。
WCF服務FileManagerService
使用此鎖定方法:
public static bool LockAsset(long FileID)
{
using (DBDataContext db = new DBDataContext())
{
var fileToLock = db.Files.Where(f => f.FileID == FileID && f.locked == false).Single();
if (fileToLock == null)
{
return false;
}
else
{
Console.WriteLine("Locked File:" + fileToLock.AssetID);
fileToLock.locked = true;
db.SubmitChanges();
return true;
}
}
}
什麼我需要在這兩種方法來改變,使隨後的行爲在一個事務的方式和對File
記錄互斥。目前,我在TakeAndProcessAJob()
方法中的SubmitChanges()
上收到更改衝突異常 - 行未更改或找到。
感謝