Pergunta

Eu uso JMeter para testar a minha aplicação web. e meu caso de teste é adicionar um registro no banco de dados. e então eu definir o "número de usuário thread" para 20, isso significa que ele irá simular 20 usuários trabalhar ao mesmo tempo. e então eu executar o caso de teste. Mas, finalmente, eu encontrei o sistema não criar 20 registros no banco de dados, mas em vez disso simplesmente criar 13 registros no banco de dados.

Eu quero saber por que isso aconteceu? É possível que, porque na minha aplicação web eu não adicionar um "sincronizado" na frente do método Records Adicionar? Eu usei o LINQ, se dois usuários postar um pedido para criar um registro para o servidor, ao mesmo tempo, o que vai acontecer? Basta criar um registro ou pode criar com êxito dois registros, ou desconhecida?

A seguir está o código de exemplo para criar um registro no banco de dados:

       public int SaveEventGroup(int id, Models.Entities.EventGroup e, Nullable<int> setpublish)
    {
        try
        {
            Entities.EventGroup db;
            if (id == 0)
            {
                db = new Entities.EventGroup();
                db.CreatedBy = e.CreatedBy;
                db.CreateDatetime = DateTime.Now;
                db.Status = true;
            }
            else
            {
                db = this.GetEventGroup(id);
            }

            db.NameCN = e.NameCN;
            db.NameEN = e.NameEN;
            db.NameZH = e.NameZH;
            db.NamePT = e.NamePT;
            db.DisplayOrder = GetGroupMaxDisplayOrder() + 1;

            if (setpublish == null)
            {
                db.PublishStatus = false;
                db.PublishDatetime = null;
                db.UpdateDatetime = DateTime.Now;
                db.UpdatedBy = e.UpdatedBy;
            }

            if (id == 0)
                dataContext.AddToEventGroupSet(db);

            dataContext.SaveChanges();

            return db.Id;
        }
        catch (Exception ex)
        {
            log.Error(ex.Message, ex);
            throw ex;
        }
    }
Foi útil?

Solução

o banco de dados em si deve ser compatível com ACID, então eu duvido que o problema é com o banco de dados quando se trata de sincronização. se você inserir um novo registro e esse registro é introduzido por algo como um inteiro auto-incremento, o banco de dados não vai stomp no que a menos que você diga a ele para atualização por esse id, em vez de inserir um novo registro. mas desde que você não está escrevendo o SQL, que realmente sabe o que você está instruindo o banco de dados para fazer.

i sugiro a remoção linq a partir da equação, e escrever manualmente isso. o que você está testando parece ser uma forma muito simples "upsert" operação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top