[firebase-br] Dúvida sobre concorrência
Marcelo Geyer
estanisgeyer em gmail.com
Sáb Fev 7 10:39:20 -03 2009
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
Mais detalhes sobre a lista de discussão lista