[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