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

Jose Aparecido da Silva joseasilva em bol.com.br
Sáb Fev 7 11:35:17 -03 2009


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





Mais detalhes sobre a lista de discussão lista