Tengo una aplicación de arquitectura S # arp que implementa un proceso ligero de procesamiento de colas mediante el cual varios subprocesos extraen entidades de una lista y establecen su estado para marcar el hecho de que el procesamiento ha comenzado en esos elementos.Problema de concurrencia de NHibernate
A pesar de incluir el bit de inicio de proceso en transacciones explícitas y el uso de un candado C#(), todavía las obtengo comenzando al mismo tiempo algunas veces.
Lamento no usar MSMQ ... bueno, sí, pero ahora este comportamiento de concurrencia me tiene desconcertado. Evidentemente, hay algo que no entiendo acerca de las transacciones y el lavado de NHibernate. ¿Me puede ayudar?
Aquí están los bits correspondientes de código:
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;
}
lo que habría esperado esto a garantizar que sólo un hilo podría cambiar el estado de una 'cosa' de una sola vez, pero conseguir esto en mis registros bastante regularmente:
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
.. y luego ambos hilos intentan operar en la misma cosa y crean un lío.
¿Qué me estoy perdiendo? Gracias.
edición: Código cambiado para reflejar cómo funciona mi registro en la versión real
¿Pudo resolver esto? –
Havent tuvo la oportunidad de probar sus sugerencias, pero lo intentaré pronto. – codeulike