Chave primaria em insert com theads

2 respostas
Duende_Macabro

Pessoal, tenho que fazer insert em um banco oracle onde uma das tabelas nao usa sequence na chave primaria. Eu pegava o ultimo e incrementava mas como é feito em paralelo em alguns momentos ele não consegui inserir por violação da chave que se repete.
Alguem tem alguma ideia pra solucionar esse problema?

Valeu. :frowning:

2 Respostas

ViniGodoy

Você terá que usar sincronização no método que faz o insert.

Coloca a palavra synchronized nele e já deve funcionar:
public synchronized void seuMetodoDeInsert()

Tudo que estiver dentro desse bloco só poderá ser executado por uma thread de cada vez, então, você tem a garantia de que o método fará o incremento antes de outra thread tentar fazer o insert.

Entretanto, se várias máquinas fizerem insert ao mesmo tempo, há uma remota possibilidade desse problema voltar a se repetir. A sincronização só é garantida num mesmo programa.

Uma das únicas formas de garantir 100% é colocando um servidor para controlar isso. Ou um servidor de aplicação, ou, como você já viu feito, o proprio servidor de banco de dados (através do SEQUENCE).

Duende_Macabro

O problema q existia em sincronizar era q ele ficaria quase sequencial por ser um bloco grande mas com algumas mudanças no banco deu pra sincronizar somente uma pequena parte sem comprometer tudo.

Valeu :smiley: .

Criado 14 de fevereiro de 2007
Ultima resposta 14 de fev. de 2007
Respostas 2
Participantes 2