Exemple #1
0
        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();
            }
            //    });
            //}
        }
Exemple #3
0
        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);
        }