Senhores :D
Tenho um programa não web que executa o seguinte comando no oracle:SELECT * FROM USUARIOS WHERE FL_PROCESSO = 'N' and ROWNUM = 1");
Isso fará com que ele traga apenas 1 registro. Ok, td certo, porém, eu terei varias instâncias desse programa rodando.
Quando eu pego um registro, eu passo ele para outra classe e o campo FL_PROCESSO é setado como 'P'. Faço isso para quando outra instancia fizer o select na tabela, nao pegar o cara q eu to usando(que setei o campo como 'P'). O problema é que isso não trata a concorrência 100%.
A minha dúvida é:
Como posso fazer para nao dar problema de um programa pegar o registro que outro ja pegou? Digamos que no meio tempo entre eu fazer o select e setar o valor do campo como 'P', vir outro cara e efetuar o select e pegá-lo? Nesse caso os dois estariam trabalhando com o mesmo registro... e isso quebra as pernas!
A minha app é assim:
public void execute(){
while(true){
RegistroDAO dao = new RegistroDAO();
List<Registro> registros = dao.getRegistrosToDo(); //AQUI PEGO O RESULTADO DO MEU SELECT
for (Registro registro : registros) {
...
//AQUI SERIA O PROBLEMA, SE NESSE EXATO MOMENTO
//UMA OUTRA INSTANCIA FIZER O SELECT, VAI PEGAR
//O REGISTRO Q ESTOU TRABALHANDO!
...
registro.setFlagProcesso("P");
registro.setDataHoraTentativa(new Date());
dao.update(registro); // AQUI FACO O UPDATE COM A FLAG 'P'
...
...
...
}
}
}