public virtual DestinoSecuencia CrearDestinoSecuenciaSQLAndLock(DestinoSecuencia destinoSecuencia, string codigSecuencia) { DestinoSecuencia entidadGuardada = null; lock (_syncObj) { using (var unitOfWork = unitOfWorkManager.Begin()) { //El bloque debe ser ejecuta forma sincrona AsyncHelper.RunSync(async() => { //1. Obtener la secuencia var valor = await secuenciaManager.GetNextSequenceSQL(codigSecuencia); //2. Utilizar secuencia destinoSecuencia.SecuenciaUtilizada = codigSecuencia; destinoSecuencia.Secuencia = valor; //Simular un error Random rand = new Random(); /////if (rand.Next(0, 2) == 0) if (rand.Next(0, 3) == 0) { throw new SimulacionException(string.Format("Error en la secuencia {0}", valor)); } //3. Guardar entidadGuardada = await DestinoRepository.InsertAsync(destinoSecuencia); }); unitOfWork.Complete(); } } return(entidadGuardada); }
private void GuardarSecuenciaDestino(SecuenciaSinDependencia secuencia, DestinoSecuencia model) { //lock (_syncObj) //{ // AsyncHelper.RunSync(async () => // { long ValorSecuencia = 0; //TransactionScopeOption.RequiresNew using (var scope = new TransactionScope()) { using (var context = new SecuenciaDbContext( )) { //Generar la siguiente secuencia var secuenciaRecuperar = context.Secuencias.AsQueryable() .Where(s => s.Codigo == secuencia.Codigo).SingleOrDefault(); //Aumentar secuencia secuenciaRecuperar.Ultimo = secuenciaRecuperar.Ultimo + secuenciaRecuperar.Incremento; model.Secuencia = secuenciaRecuperar.Ultimo; model.Fecha = DateTime.Now; //Establecer Valor ValorSecuencia = secuenciaRecuperar.Ultimo; model.Secuencia = secuenciaRecuperar.Ultimo; model.SecuenciaUtilizada = secuencia.Codigo; context.DestinoSecuencia.Add(model); //Actualizar secuencia context.Entry(secuenciaRecuperar).State = EntityState.Modified; //await context.SaveChangesAsync(); //Save change to this context context.SaveChanges(); } //Simular un error Random rand = new Random(); if (rand.Next(0, 2) == 0) { throw new Exception(string.Format("Error en la secuencia {0}", ValorSecuencia)); } scope.Complete(); } // }); //} }
public virtual DestinoSecuencia CrearDestinoSecuenciaSQLWithIsoSerializable(DestinoSecuencia destinoSecuencia, string codigSecuencia) { //Establecer el asilamiento a Serializable var unitOfWorkOptions = new UnitOfWorkOptions(); unitOfWorkOptions.IsolationLevel = IsolationLevel.Serializable; //transactionOptions.Timeout = TransactionManager.MaximumTimeout; DestinoSecuencia entidadGuardada = null; using (var unitOfWork = unitOfWorkManager.Begin(unitOfWorkOptions)) { //El bloque debe ser ejecuta forma sincrona AsyncHelper.RunSync(async() => { //1. Obtener la secuencia var valor = await secuenciaManager.GetNextSequenceSQL(codigSecuencia); //2. Utilizar secuencia destinoSecuencia.SecuenciaUtilizada = codigSecuencia; destinoSecuencia.Secuencia = valor; //Simular un error Random rand = new Random(); if (rand.Next(0, 3) == 0) { throw new SimulacionException(string.Format("Error en la secuencia {0}", valor)); } //3. Guardar entidadGuardada = await DestinoRepository.InsertAsync(destinoSecuencia); }); unitOfWork.Complete(); } return(entidadGuardada); }