Como que eu posso criar um método que, quando eu criar uma nova ordem de serviços, incrementar mais um no número da ordem de serviço?
Por exemplo:
os de número: 0001 | 0002 e assim vai!
Desde já,agradeço!
Como que eu posso criar um método que, quando eu criar uma nova ordem de serviços, incrementar mais um no número da ordem de serviço?
Por exemplo:
os de número: 0001 | 0002 e assim vai!
Desde já,agradeço!
Você está usando qual banco de dados?
Se você quer saber o número total de ordens, ou linhas, pode usar o método count() para contar todas as linhas que existem na tabela.
Para quê isso? Para ter um controle?
Faça ao final, quando a OS estiver criada e salva no banco de dados.
MySQL
Ele não quer saber o número total de ordens exatamente, ele precisa gerar um número para a ordem que não seja a PK auto incremento do banco, pois com a PK corre o risco de pular alguns números caso ocorra algum rollback na operação.
É exatamente isso!
Obrigado
lucastody
Você pode salvar o registro no banco normalmente, e depois atualizar o registro gravado com um número para ele. Para isso, você deve criar um método synchronized no java que faça isso. Nesse método, você recupera o último número atribuído, incrementa mais 1 e atualiza o registro que estiver trabalhando. O método synchronized vai garantir que apenas um usuário por vez irá fazer essa ação.
Se essa operaçao estiver dentro de uma transaçao do db (e nesse caso deveria) mesmo usando synchronized você pode gerar números repetidos.
Um jeito rápido de fazer isso (e meio sujo) é colocar um check de unicidade na coluna e tentar atualizar o valor, repetindo o processo se falhar por duplicidade.
Ao gravar a ordem no db envia esta sem o número
Cria uma trigger no db que ao salvar pega o cadastro anterior e acrescenta 1
Dentro de um bloco sincronizado, como poderia acontecer de gerar números repetidos?
Talvez tenha entendido errado sua soluçao, mas me parece que o código seria semelhante a isso:
void gravaNovaOrdem() {
abreTransacaoDb();
criaOrdemDbNormalmente();
sync { atualizaOrdemComMaiorNúmero() };
commitaTransacaoDb();
}
Nesse caso se duas threads em paralelo chegarem ao commitaTransacaoDb ao mesmo tempo, elas teriam o mesmo número.
Colocando synchronized no método gravaNovaOrdem() resolveria, caso sua aplicaçao esteja rodando em apenas um servidor.
Entendi Abel, e o q vc disse faz sentido, porém, eu tinha pensado em duas transações, a primeira criaria a ordem sem número, e a segunda transação iria ficar responsável por atribuir o número para a ordem, que seria feito num bloco sincronizado. Bom, talvez não tenha pensado direito e não seja uma boa solução. O que vc acha?
void gravarOrdem() {
abreTransacaoDb();
criaOrdemDbNormalmente();
commitaTransacaoDb();
}
void sync atribuirNumero(Ordem ordem) {
abreTransacaoDb();
atualizaOrdemComMaiorNúmero(ordem)
commitaTransacaoDb();
}
Oi @Lucas_Camara, desculpe a demora na resposta.
Sua abordagem resolveria o problema citado mas acabaria eliminando o efeito da transaçao no DB. Se o método atribuirNumero lançar uma exceçao você teria uma ordem no banco, comitada, sem o número da ordem.
Acho que o synchronized funcionaria, se você colocasse a lógica inteira nele, contando que a aplicaçao se limite a um servidor.
Realmente isso aconteceria, e teria que ser tratado, caso o número da ordem seja NULL. Mas, acredito, que resolveria o problema da numeração.