Eu estou tentando aprender um pouco mais sobre os recursos de Locking to JPA2. Comecei, então, lendo este artigo da Carol McDonald mas não consigo fazer os exemplos funcionarem. Veja o exemplo sobre lock otimista da figura 2. P/ testa-lo eu usei o seguinte código:
EntityManager em0 = emf.createEntityManager();
EntityManager em1 = emf.createEntityManager();
System.out.println("em0 = " + em0);
System.out.println("em1 = " + em1);
em0.getTransaction().begin();
em1.getTransaction().begin();
Pais p0 = em0.find(Pais.class, 1);
Estado e1 = em1.find(Estado.class, 1);
Pais p1 = e1.getPais();
em1.lock(p1, LockModeType.OPTIMISTIC);
p0.setTeste(p0.getTeste() + 1);
e1.setTeste(e1.getTeste() + 1);
em0.getTransaction().commit();
em1.getTransaction().commit();
No artigo Carol fala q o lock otimista é adequado p/ quando vc tem dependências entre duas ou mais entidades e vc precisa garantir consistência. De acordo com o artigo da Carol a segunda transação deveria falhar pq o objeto em q eu dei lock (em1.lock(p1, LockModeType.OPTIMISTIC)) foi atualizado em uma transação concorrente e, no commit da segunda transação, a diferença de versões seria detectada pelo JPA. De fato esse código executa até a ultima linha e as duas entidades são atualizadas com sucesso.
Agora, alguém sabe me dizer onde eu estou errando?