11.07.2015 Views

Persistência com JPA2 e Hibernate - Inpi

Persistência com JPA2 e Hibernate - Inpi

Persistência com JPA2 e Hibernate - Inpi

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

73 ENTITY MANAGERHá várias maneiras de utilizar o locking pessimista.quando um objeto é buscado através do método find().Uma delas é passar mais um parâmetro1 Conta x = manager . find ( Conta .class , 1L, LockModeType . PESSIMISTIC_WRITE );Uma grande dificuldade em utilizar locking pessimista é que podemos gerar um deadlock. Suponhaque dois Entity Managers busquem o mesmo objeto na mesma thread utilizando o lockingpessimista <strong>com</strong>o mostra o código a seguir.1 Conta x = manager1 . find ( Conta .class , 1L, LockModeType . PESSIMISTIC_WRITE );2 Conta y = manager2 . find ( Conta .class , 1L, LockModeType . PESSIMISTIC_WRITE );3 manager1 . <strong>com</strong>mit ();// NUNCA VAI EXECUTAR ESSA LINHANa linha 1, o primeiro Entity Manager “trava” a conta <strong>com</strong> identificador 1 e esse objeto só seráliberado na linha 3. Na linha 2, o segundo Entity Manager vai esperar o primeiro liberar o objeto,impedindo que a linha 3 seja executada. Dessa forma, a linha 3 nunca será executada. Depois de umcerto tempo esperando na linha 2, o segundo Entity Manager lança uma exceção.Exercícios de Fixação47 Teste o problema de deadlock quando o locking pessimista é utilizado. Adicione a seguinteclasse no pacote br.<strong>com</strong>.k19.testes do projeto K19-EntityManager.1 public class TestaDeadLock {2 public static void main ( String [] args ) {3 EntityManagerFactory factory = Persistence4 . createEntityManagerFactory (" K21_entity_manager_pu ");56 EntityManager manager1 = factory . createEntityManager ();7 EntityManager manager2 = factory . createEntityManager ();89 manager1 . getTransaction (). begin ();10 manager2 . getTransaction (). begin ();1112 manager1 . find ( Produto .class , 1L, LockModeType . PESSIMISTIC_WRITE );13 System . out . println (" Produto 1 travado ");14 manager2 . find ( Produto .class , 1L, LockModeType . PESSIMISTIC_WRITE );15 System . out . println (" Essa mensagem não será impressa !!! ");1617 manager1 . getTransaction (). <strong>com</strong>mit ();18 manager2 . getTransaction (). <strong>com</strong>mit ();1920 manager1 . close ();21 manager2 . close ();2223 factory . close ();24 }25 }Código Java 3.78: TestaDeadLock.javaExecute e aguarde até ocorrer uma exceção.www.k19.<strong>com</strong>.br 73

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!