[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