Locar tabelas em uma trigger
Prezados, boa tarde.
Estamos com uma dúvida aqui no meu trabalho com relação a uma trigger.
Precisamos criar um campo código na tabela MANIFESTACAO deverá ser no formato AAAANNNNNNN.Exemplos:
20140000001
20140000002
.
.
.
20140000325
.
.
.
20150000001
20150000002
Para cada registro guardado na tabela manifestação, é gerado um código que é o incremento do código anterior, concatenado com o ano do cadastro da manifestação.
Criamos uma trigger para a geração automática desses códigos. Criamos também uma tabela chamada GERACAO_CODIGO, que possui 2 campos, ANO e CONTADOR, para ajudar na criação dos códigos.
O código da nossa trigger para a tabela MANIFESTACAO é o seguinte:
CREATE OR REPLACE TRIGGER TRIGGER_GERA_CODIGO BEFORE INSERT ON MANIFESTACAO
FOR EACH ROW
DECLARE
PANO NUMBER(4);
PCONTADOR NUMBER(11);
PCODIGO NUMBER(11);BEGIN
select EXTRACT(YEAR FROM :NEW.DT_CADASTRO_MANIFESTACAO)
INTO PANO
from dual;
SELECT NVL(MAX(contador)+1,1)
INTO PCONTADOR
FROM GERACAO_CODIGO WHERE ANO = PANO;
IF (PCONTADOR = 1) THEN
INSERT INTO GERACAO_CODIGO values(PANO,1);
ELSE
UPDATE GERACAO_CODIGO
SET CONTADOR = PCONTADOR
WHERE ANO = PANO;
END IF;
PCODIGO := TO_NUMBER(PANO || LPAD(PCONTADOR,7,0));
:NEW.CODIGO := PCODIGO;
END;
A minha dúvida é a seguinte:
Essa trigger faz o lock da tabela GERACAO_CODIGO?
Em caso de negativo, como eu faço para lockar a tabela GERACAO_CODIGO, para que não haja o risco de que se gere 2 codigos iguais, quando haver 2 transações concorrentes?
Antecipadamente agradeço a ajuda!
Observação: Minha classe java está com a annotation @Transactional do Spring acima da classe.
Discussão (11)
Carregando comentários...