Olha o problema, sei que muitas pessoas ja passou por isso, vou salvar um registro e queria saber com qual PK o registro vai ser salvo! Considerando que outras pessoas tambem podem inserir outros registros,
Acho que seria um sequencia assim:
1- salvo um registro e logo faço um update
assim o registro fica bloqueado.
mas a tabela tem relacionamento e eu vou precisar de um registro da tabela que tem relacionamento,
e se atabela nao tiver registro ?, …, …, … .
int i = consultanoBanco("SELECT nextval('serial');"); //a variável i agora tem a chave do registro;
inserteNobanco("INSERT INTO distributors VALUES ("+i+", 'nothing')");
Claro que não dessa maneira terrível que eu apresentei…
Apenas para exemplificar
Eu abro um formulario que me traz o numero do Protocolo que é o numero da PK da Tabela,
Outro pessoa abre um outro formulario que me traz o numero do Protocolo que é o numero da PK da Tabela.
Qunado os dois forem salvar, alguem vai ter o numero de protocolo trocado.
Quem fez o sistema pegou a proxima PK e apresentou como numero de protocolo.
Tente utilizar o currval(‘nome_sequence’), ele pega o registro que está sendo inserido no momento.
Por exemplo:
[code]//Insere na tabela Evento
stm = conn.prepareStatement(“INSERT INTO Evento (idCadastroPessoa, idTipoEvento, dataEvento, valorEvento, obs) VALUES (?, ?, ?, ?, ?)”);
//Insere na tabela MatriculaRenovacao com a PK da tabela Evento
stm = conn.prepareStatement(“INSERT INTO MatriculaRenovacao (idEvento, horaMatricula, tipo) VALUES (currval(‘evento_idevento_seq’), ?, ?)”);[/code]
Mesmo em uma transação.
Se tiver concorrência terá problemas.
Para isto existem sequences.
Consultando o id (único) antes de inserir, é impossível problemas de concorrência (teoricamente é claro, nunca sabemos o improvável).