Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

LockTimeoutException

Ao tentar fazer o "caminho feliz" e persistir, a ação acaba demorando um pouco e logo em seguida recebo um LockTimeoutException.

public class TestaContaCliente {

    public static void main(String[] args) {

        Cliente cli = new Cliente();
        cli.setNome("Apendicilino Freitas");
        cli.setProfissao("Farmacêutico");
        cli.setEndereco("Rua Rua, 123");

        Cliente cli2 = new Cliente();
        cli2.setNome("Douglas");
        cli2.setEndereco("Rua Fulano, 234");
        cli2.setProfissao("Professor");

        Conta conta = new Conta();
        conta.setId(2);

        cli.setConta(conta);
        cli2.setConta(conta);

        EntityManager em = new JPAUtil().getEntityManager();
        em.getTransaction().begin();
        em.persist(cli);
//        em.persist(cli2);
        em.getTransaction().commit();
        em.close();
    }
}

No final das contas nada é persistido no banco. Não consegui achar o problema no meu código.

4 respostas

Opa, é estranho mesmo... Parece que tem algum outro registro sendo atualizado e a tabela foi lockada para isso... Mas realmente ta misterioso. Não consegui ajudar muito, desculpa :(.

Envia o log do processamento com o erro para termos mais insumos para lhe ajudar.

Este é o log completo do erro ao tentar fazer o insert:

jul 31, 2018 10:23:11 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 1205, SQLState: 41000
jul 31, 2018 10:23:11 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Lock wait timeout exceeded; try restarting transaction
Exception in thread "main" javax.persistence.LockTimeoutException: could not execute statement
    at org.hibernate.internal.ExceptionConverterImpl.wrapLockException(ExceptionConverterImpl.java:226)
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:98)
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:157)
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:164)
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:789)
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:767)
    at br.com.ph.financas.teste.TestaContaCliente.main(TestaContaCliente.java:31)
Caused by: org.hibernate.exception.LockTimeoutException: could not execute statement
    at org.hibernate.dialect.MySQLDialect$3.convert(MySQLDialect.java:532)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:97)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:178)
    at org.hibernate.dialect.identity.GetGeneratedKeysDelegate.executeAndExtract(GetGeneratedKeysDelegate.java:57)
    at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:42)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2919)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3510)
    at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:81)
    at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:637)
    at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:282)
    at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:263)
    at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:317)
    at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:318)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:275)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:182)
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:113)
    at org.hibernate.jpa.event.internal.core.JpaPersistEventListener.saveWithGeneratedId(JpaPersistEventListener.java:67)
    at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:189)
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:132)
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:58)
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:782)
    ... 2 more
Caused by: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3515)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3447)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1951)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2101)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2554)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1761)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2046)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1964)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1949)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:175)
    ... 20 more

isso é o log logo após a tentativa de insert. Não coloquei tudo pois estourava o máximo de caracteres.

solução!

Senhores, depois de muito esforço e à muito custo, percebi que quando passava o mouse sobre o "run" a frase 'minhaclasse' is already runing aparecia> Eu costumo usar os atalhos para rodar e por várias vezes fiz o terminate (na aba console do Eclipse) pensando que talvez isso pudesse ser a causa do deadlock, mas não era. Eu clicava no terminate e à principio parecia que a requisição havia terminado, porém ao passar o mouse sobre o botão 'run' vi que era como se a requisição estivesse ainda funcionando. Em resumo, nas configurações de run do Eclipse eu marquei a opção 'Stop in Main', mais por intuição do que por conhecimento, e isso acabou resolvendo o meu problema. Não sei se isso é a melhor coisa a fazer e nem se é uma solução definitiva. Deixarei mais um tempo em aberto até marcar a solução, na esperança de haver uma boa explicação para esta situação. Desde já agradeço a atenção.