[firebase-br] RES: Dúvida sobre concorrência

Marcelo Geyer estanisgeyer em gmail.com
Sáb Fev 7 11:44:48 -03 2009


Olá, obrigado por responder.

Acho que não deixei claro. Eu uso sim Generator (SEQUENCE na verdade).
Quando eu coloco "uma trigger é disparada que pega o próximo número para
alimentar o campo PEDIDO" é justamente isso, uma trigger, ao inserir o
registro, dispara o "generator" (SEQUENCE no meu caso). A dúvida fica por
conta com as outras tabelas, uma vez que eu não gostaria que tivesse
"buracos" na sequencia. No comando INSERT da tabela PEDIDOS eu usaria
RETURNING para retornar o número do pedido, disparado pela trigger, para
poder alimentar as outras tabelas, mas e se alguma operação falhar e eu der
um rollback e no meio deste percurso houver uma concorrência no GENERATOR?
Vou ter um "buraco" na sequencia? Essa é minha dúvida.

2009/2/7 Jose Aparecido da Silva <joseasilva em bol.com.br>

> E se dois usuários iniciarem o pedido ao mesmo tempo?
>
> Esquece isso! Use generator que você nunca vai ter problemas
> Criar generator:
> Create generator GEN_PEDIDO;
>
> Obter o generator atual:
>
> Select gen_id(GEN_PEDIDO,1) from RDB$DATABASE;
>
> Se voce usa Delphi:
>
> NrPedido:= Query.Fields[0].asInteger;
>
> E usa o NrPedido apropriadamente no seu sistema.
> Faço isso e nunca tive problema
>
> [ ]'s
> José Aparecido da Silva
> Fasystem Ass. Em Inf. Ltda
> São José dos Pinhais - PR
>
>
> -----Mensagem original-----
> De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br]
> Em
> nome de Marcelo Geyer
> Enviada em: sábado, 7 de fevereiro de 2009 10:39
> Para: FireBase
> Assunto: [firebase-br] Dúvida sobre concorrência
>
> Bom dia, amigos,
>
> Tenho uma dúvida quanto a concorrência. Vejam as tabelas envolvidas abaixo:
>
> CREATE TABLE PEDIDOS
> (
>    PEDIDO INTEGER NOT NULL,
>    TIPO SMALLINT DEFAULT 0 NOT NULL,
>    ID_CLIENTE INTEGER NOT NULL,
>    DATA_HORA_EMI TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
>    VALOR_FRETE MONEY DEFAULT 0.00 NOT NULL,
>    VALOR_TOTAL MONEY DEFAULT 0.00 NOT NULL,
>    STATUS INTEGER DEFAULT 0 NOT NULL,
>    DADOS_ADICIONAIS BLOB sub_type 1,
>    ID_USUARIO INTEGER NOT NULL,
>
>    CONSTRAINT PK_PEDIDOS
>        PRIMARY KEY (PEDIDO),
>
>    CONSTRAINT FK_PEDIDOS
>        FOREIGN KEY (ID_CLIENTE) REFERENCES CLIENTES (CODIGO_CLIENTE),
>        FOREIGN KEY (ID_USUARIO) REFERENCES USUARIOS (CODIGO_USUARIO)
> );
>
>
> CREATE TABLE PEDIDOS_ITEM
> (
>    PEDIDO INTEGER NOT NULL,
>    NRO_ITEM SMALLINT NOT NULL,
>    ID_PRODUTO VARCHAR(50) NOT NULL,
>    PRODUTO VARCHAR(120) NOT NULL,
>    QTDE DOUBLE PRECISION NOT NULL,
>    UN_MEDIDA VARCHAR(5) NOT NULL,
>    VALOR MONEY NOT NULL,
>    VALOR_TOTAL MONEY NOT NULL,
>    DETALHES VARCHAR(60),
>
>    CONSTRAINT PK_PEDIDOS_ITEM
>        PRIMARY KEY (PEDIDO, NRO_ITEM, ID_PRODUTO),
>
>    CONSTRAINT FK_PEDIDOS_ITEM1
>        FOREIGN KEY (PEDIDO) REFERENCES PEDIDOS (PEDIDO)
>        ON UPDATE CASCADE
>        ON DELETE CASCADE,
>
>    CONSTRAINT FK_PEDIDOS_ITEM2
>        FOREIGN KEY (ID_PRODUTO) REFERENCES PRODUTOS (CODIGO_PRODUTO)
>        ON UPDATE NO ACTION
>        ON DELETE NO ACTION
> );
>
>
> CREATE TABLE PEDIDOS_HIST
> (
>    PEDIDO INTEGER NOT NULL,
>    DATA_HORA TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
>    STATUS INTEGER DEFAULT 0 NOT NULL,
>    HISTORICO BLOB sub_type 1 NOT NULL,
>    ID_USUARIO INTEGER NOT NULL,
>
>    CONSTRAINT PK_PEDIDOS_HIST
>        PRIMARY KEY (PEDIDO, DATA_HORA),
>
>    CONSTRAINT FK_PEDIDOS_HIST
>        FOREIGN KEY (PEDIDO) REFERENCES PEDIDOS (PEDIDO)
>        ON UPDATE CASCADE
>        ON DELETE CASCADE
> );
>
> Ao inserir um registro na tabela PEDIDOS, uma trigger é disparada que pega
> o
> próximo número para alimentar o campo PEDIDO. Na mesma transação, é
> retornado esse número do pedido para o aplicativo para inserir registros
> nas
> outras tabelas.
> Se ocorrer um erro, por exemplo, na tabela PEDIDOS_HIST, um rollback é
> realizado. Como funciona este processo em operações com muitas
> concorrências? O banco de dados vai aguardar a transação anterior para
> saber
> se o número do pedido, pego pela trigger, será realizada ou posso ter a
> possibilidade do número ser "pulado" em virtude do rollback?
>
> Abraços,
>
> Marcelo E. Geyer
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
> Nenhum vírus encontrado nessa mensagem recebida.
> Verificado por AVG - www.avgbrasil.com.br
> Versão: 8.0.233 / Banco de dados de vírus: 270.10.19/1938 - Data de
> Lançamento: 02/06/09 17:28:00
>
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>



Mais detalhes sobre a lista de discussão lista