我有一個S#arp體系結構應用程序,它實現了一個輕量級的隊列處理事物,從而各種線程從列表中拉取實體並設置其狀態以標記處理已開始處理這些項目。NHibernate併發問題
儘管在顯式事務中使用C#lock()封裝了啓動處理位,但我仍然有時會在同一時間啓動它們。
我很後悔沒有使用MSMQ ......呃,是的,但現在這種併發行爲讓我感到莫名其妙。顯然有一些我不瞭解NHibernate事務和刷新。你能幫我嗎?
這裏的代碼的相關位:
private static object m_lock = new object();
private bool AbleToStartProcessing(int thingId)
{
bool able = false;
try
{
lock (m_lock)
{
this.thingRepository.DbContext.BeginTransaction();
var thing = this.thingRepository.Get(thingId);
if (thing.Status == ThingStatusEnum.PreProcessing)
{
able = true;
thing.Status = ThingStatusEnum.Processing;
}
else
{
logger.DebugFormat("Not able to start processing {0} because status is {1}",
thingId, thing.Status.ToString());
}
this.thingRepository.DbContext.CommitTransaction();
}
}
catch (Exception ex)
{
this.thingRepository.DbContext.RollbackTransaction();
throw ex;
}
if (able)
logger.DebugFormat("Starting processing of {0}",
thingId);
return able;
}
我本來期望這保證只有一個線程可以一次更改的「東西」的狀態,但我得到這個在我的日誌漂亮定期:
2011-05-18 18:41:23,557 thread41 DEBUG src:MyApp.Blah.ThingJob - Starting processing of 78090
2011-05-18 18:41:23,557 thread51 DEBUG src:MyApp.Blah.ThingJob - Starting processing of 78090
..然後兩個線程試圖對同一件事進行操作,並創建一個爛攤子。
我錯過了什麼?謝謝。
編輯:更改代碼,以反映我的日誌在現實版本
你能解決這個問題嗎? – 2011-05-23 21:37:29
沒有機會嘗試你的建議,但我會盡快給它。 – codeulike 2011-05-23 21:46:08