Usuário com melhor resposta
Controle de Numero Duplicando

Pergunta
-
Possuo um controle de numero, ex: controle de senha
Porém está ocorrendo de sair dois pedidos com mesma senha.
Atualmente exitem 5 maquinas tirando pedidos e acontece esse problema algumas vezes.
Para pegar o próxima senha estou executando o SQL
update pedidoconfiguracao set senha = senha + 1;
select senha from pedidoconfiguracao;Qual é uma boa prática para realizar esse tipo de controle evitando que dois pedidos peguem a mesma senha?
Respostas
-
Boa tarde Raphael!
Qual sua versão do SQL Server? Caso seja o 2012 ou superior, considere o uso da SEQUENCE. Segue abaixo o link com a documentação da MSDN:
https://msdn.microsoft.com/pt-br/library/ff878091.aspx
Você pode criar uma sequence do tipo:
CREATE SEQUENCE SQ_NumeroPedido START WITH 1 INCREMENT BY 1 NO CACHE; GO
E para selecionar o próximo valor, pode fazer o seguinte:
DECLARE @Numero INT SELECT @Numero = NEXT VALUE FOR SQ_NumeroPedido SELECT @Numero
Abraços
- Sugerido como Resposta João Otávio A sexta-feira, 16 de dezembro de 2016 18:45
- Marcado como Resposta Raphael N. Bressam domingo, 18 de dezembro de 2016 14:21
Todas as Respostas
-
Boa tarde,
Acho que você pode utilizar uma variável no Update. Ex:
declare @senha integer; update pedidoconfiguracao set @senha = senha = senha + 1; select @senha
Espero que ajude
Assinatura: http://www.imoveisemexposicao.com.br
-
Rafael ,existe algumas estratégias para isso, mas preciso tirar umas duvidas
como e a rotina de geração de pedidos ? (e pela aplicação ? ou uma SP ? )
vc tem que atentar a rotina que recupera a senha
exemplo:
Maquina 1 = getUltimaSenha >retorna 1000
Maquina2 = UpdadeSenha > muda senha para 1001
Maquina1 = getUltimaSenha >retorna 1001
Maquina3 = getUltimaSenha >retorna 1001
vou dar uma estrategia que pode se encaixar no seu contexto.
segue o algoritimo a ser visto
veja que a rotina deve estar dentro de uma transação , ou implementada dentro do banco , ou na aplicação
o mais importante e estar dentro da transação
CREATE TABLE SenhasSequencias( Tabela VARCHAR(MAX), senha INT , )
--Primeiro valor Default INSERT INTO dbo.SenhasSequencias ( Tabela, senha ) VALUES ( 'Pedidos', -- Tabela - varchar(max) 1 -- senha - int )
--Rotina a ser implementada ou no banco ou na aplicação BEGIN TRANSACTION SalvarPedido IF(GerarNovoPedido) BEGIN DECLARE @NovaSenha INT; SET @NovaSenha = (SELECT MAX(S.senha) +1) FROM dbo.SenhasSequencias WHERE Tabela ='Pedidos') salvarPedido(DadosDoPedido ,@NovaSenha) IF SalvouSemErros =1 BEGIN UPDATE dbo.SenhasSequencias SET senha =@NovaSenha WHERE Tabela ='Pedidos' END IF SalvouSemErros =1 COMMIT ELSE ROLLBACK END END
Wesley Neves
-
Boa tarde Raphael!
Qual sua versão do SQL Server? Caso seja o 2012 ou superior, considere o uso da SEQUENCE. Segue abaixo o link com a documentação da MSDN:
https://msdn.microsoft.com/pt-br/library/ff878091.aspx
Você pode criar uma sequence do tipo:
CREATE SEQUENCE SQ_NumeroPedido START WITH 1 INCREMENT BY 1 NO CACHE; GO
E para selecionar o próximo valor, pode fazer o seguinte:
DECLARE @Numero INT SELECT @Numero = NEXT VALUE FOR SQ_NumeroPedido SELECT @Numero
Abraços
- Sugerido como Resposta João Otávio A sexta-feira, 16 de dezembro de 2016 18:45
- Marcado como Resposta Raphael N. Bressam domingo, 18 de dezembro de 2016 14:21
-
Boa tarde Raphael!
Qual sua versão do SQL Server? Caso seja o 2012 ou superior, considere o uso da SEQUENCE. Segue abaixo o link com a documentação da MSDN:
https://msdn.microsoft.com/pt-br/library/ff878091.aspx
Você pode criar uma sequence do tipo:
CREATE SEQUENCE SQ_NumeroPedido START WITH 1 INCREMENT BY 1 NO CACHE; GO
E para selecionar o próximo valor, pode fazer o seguinte:
DECLARE @Numero INT SELECT @Numero = NEXT VALUE FOR SQ_NumeroPedido SELECT @Numero
Abraços
Raphael,
A sugestão do Otávio é interessante, acredito que seja útil avaliar esta possibilidade.
Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
-