Bloquear acesso a registro em uso

Olá, em um sistema Java JSF com Primefaces, tenho um cadastro de Ordens de produção (OP’s) que serão executadas pelas 4 linhas de produção em tempo real no chão de fabrica e estamos com o seguinte problema:

  • O operador de uma linha seleciona indevidamente a mesma OP que a outra linha esta usando no momento, ocasionando uma série de inconsistências no sistema, então preciso bloquear quando um operador selecionou uma OP, para que outro também não o faça ao mesmo tempo.

Obs.: Até pensei em criar um campo no banco de dados que no primeiro acesso o sistema preencha com “S” para indicar que esta em uso, e no final volte para “N”, mas se ocorrer algum erro antes de finalizar o registro ficará sempre bloqueado e ninguém irá conseguir utiliza-lo.

Essa forma que vc pensou trata-se de um lock otimista e seria o ideal, basta fazer o tratamento em caso de sucesso e falha.

Mas caso não queria criar a coluna no banco, vc pode tentar manter esse controle em memória em um código sincronizado (synchronized). Com isso, vc consegue garantir o acesso ao registro um usuário por vez. Porém, esse mecanismo é falho caso tenha mais de uma instância da aplicação em execução.