Gostaria de saber como implementar : pessimistic | optimistic lock no JPA.
Penso que tudo se esclarecerá melhor com um exemplo:
Num cenario com três entidades - Produto {id, descricao, preco, quantidade} , ItemVenda {id, produto, preco, quantidade} e Venda{id, List
Um processo que determina uma compra é: verificar se há a quantidade de produtos e diminuir essa quantidade.
public void realizaCompra(){
tx.begin();
for (ItemVenda item : venda.getItensVendas()){
Produto produtoDoBanco = em.find(Produto.class,item.getProduto().getId());
if (produtoDoBanco.getQuantidade() < item.getProduto().getQuantidade()){
throw new NaoHaEstoqueException("não há itens para essa venda");
} else {
produtoDoBanco.diminuirUnidades(item.getProduto().getQuantidade());
em.persist(produtoDoBanco);
}
}
em.persist(venda);
tx.commit();
}
Melhorando minha pergunta... qual tipo de lock eu deveria usar? (ou um para cada...?)
No momento em que estou lendo a quantidade de produtos que há no estoque, ninguém deveria ser capaz de alterar esse valor ... se não estiver claro ... tentarei utilizar outras palavras. :)
[Consegui resolver e até públiquei um post sobre o assunto (pouco explorado) - concorrência na JPA - http://archsofty.blogspot.com/2009/10/jpa-lock-otimista-e-pessimista.html ]