简体   繁体   English

锁等待超时超过 JPA 插入

[英]Lock wait timeout exceeded JPA inserting

I know it seems duplicated, but I have been looking for a solutions in while.我知道它似乎重复,但我一直在寻找解决方案。

I'm trying to insert two entities in the DB(Mysql) and I'm getting : ERROR: Lock wait timeout exceeded;我试图在 DB(Mysql) 中插入两个实体,我得到:错误:超出锁定等待超时; try restarting transaction I'm using JPA with Hibernate, and Spring for transaction control.尝试重新启动事务我使用 JPA 和 Hibernate,并使用 Spring 进行事务控制。

I already increased the timeout of Mysql, and tried to change the Entity Manager lock type to OPTIMISTIC_FORCE_INCREMENT.我已经增加了Mysql的超时时间,并尝试将实体管理器锁类型更改为OPTIMISTIC_FORCE_INCREMENT。

I have the following entitys: Professional(Hiding other parts.):我有以下实体:专业(隐藏其他部分。):

@Entity(name = "Professional")
@Table(name = "professional")

    public class Professional implements Serializable {

        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Long id;

        @OneToMany(mappedBy = "professional")
        private Set<ProfessionalCurso> cursosProfissionais;

    }

Curso:光标:

@Entity(name = "Curso")
@Table(name = "curso")
public class Curso implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = -960848258531573118L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
}

ProfessionalCurso:专业光标:

    @Entity(name = "ProfessionalCurso")
    @Table(name = "professional_curso")
    public class ProfessionalCurso implements Serializable {

        private static final long serialVersionUID = -7896761710764415980L;

        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Long id;

@Column(name = "professional_id")
private Long professionalID;

@ManyToOne
@JoinColumn(name = "professional_id", insertable = false, updatable = false)
private Professional professional;

@Column(name = "pais_id")
private Long paisID;

@OneToOne
@JoinColumn(name = "pais_id", insertable = false, updatable = false)
private Pais pais;

@Column(name = "instituicaoEnsinoID")
private Long instituicaoEnsinoID;

@OneToOne
@JoinColumn(name = "instituicaoEnsinoID", insertable = false, updatable = false)
private InstituicaoEnsino instituicaoDeEnsino;

@Column(name = "curso_id")
private Long cursoID;

@OneToOne
@JoinColumn(name = "curso_id", insertable = false, updatable = false)
private Curso curso;

// Categoria do curso introduzida pelo campo aberto
@Column(name = "categoria")
private String categoria;

@Column(name = "dataFormacao")
private Date dataFormacao;

}

While trying to insert using the following :在尝试使用以下内容插入时:

@Service
@Transactional(propagation = Propagation.REQUIRED)
public class ProfessionalService implements IProfessionalService {
@Override
    public void createProfessional(final Professional professional) {

        this.professionalDAO.save(professional);

        Set<ProfessionalCurso> cursosProfissionais = professional.getCursosProfissionais();
        for(ProfessionalCurso pcur : cursosProfissionais)
        {
            pcur.setProfessional(professional); 
            this.professionalCursoDAO.save(pcur);
        }
    }
}

My ProfessionalDAO and ProfessionalCursoDAO all of them extends from AbstractDAO:我的 ProfessionalDAO 和 ProfessionalCursoDAO 都是从 AbstractDAO 扩展而来的:

@Transactional(propagation = Propagation.REQUIRED)
public abstract class AbstractDAO<T> implements IAbstractDAO<T>, Serializable {

    private static final long serialVersionUID = -8560745833920157266L;

    private EntityManager entityManager;

    private final Class<T> oClass;//object class

    public Class<T> getObjectClass() {
        return this.oClass;
    }

    @SuppressWarnings("unchecked")
    public AbstractDAO()
    {
        this.oClass = (Class<T>)
                ( (ParameterizedType) getClass().getGenericSuperclass() ).
                getActualTypeArguments()[0];
    }

    @Override   
    public T save(T object) {   
        getEntityManager().clear();
        //this.entityManager.lock(object, LockModeType.OPTIMISTIC_FORCE_INCREMENT);
        getEntityManager().persist(object);     
        return object;
    }
} 

The stacktrace:堆栈跟踪:

WARNING: #{criarProfessionalController.execute}: javax.persistence.LockTimeoutException: could not execute statement
javax.faces.FacesException: #{criarProfessionalController.execute}: javax.persistence.LockTimeoutException: could not execute statement
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118)
    at javax.faces.component.UICommand.broadcast(UICommand.java:315)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:658)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:474)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:495)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:767)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1347)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)
Caused by: javax.faces.el.EvaluationException: javax.persistence.LockTimeoutException: could not execute statement
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:101)
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
    ... 29 more
Caused by: javax.persistence.LockTimeoutException: could not execute statement
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.wrapLockException(AbstractEntityManagerImpl.java:1812)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1715)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1677)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1683)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1187)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:344)
    at com.sun.proxy.$Proxy31.persist(Unknown Source)
    at co.mz.mukhero.fme.dao.AbstractDAO.save(AbstractDAO.java:45)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
    at com.sun.proxy.$Proxy50.save(Unknown Source)
    at co.mz.mukhero.fme.service.ProfessionalService.createProfessional(ProfessionalService.java:79)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
    at com.sun.proxy.$Proxy53.createProfessional(Unknown Source)
    at co.mz.mukhero.fme.controller.CriarProfessionalController.execute(CriarProfessionalController.java:712)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.el.parser.AstValue.invoke(AstValue.java:247)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:267)
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
    ... 30 more
Caused by: org.hibernate.exception.LockTimeoutException: could not execute statement
    at org.hibernate.dialect.MySQLDialect$1.convert(MySQLDialect.java:447)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:211)
    at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:96)
    at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:58)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3032)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3558)
    at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:98)
    at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:492)
    at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:197)
    at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:181)
    at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:216)
    at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:324)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:288)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:194)
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:125)
    at org.hibernate.jpa.event.internal.core.JpaPersistEventListener.saveWithGeneratedId(JpaPersistEventListener.java:84)
    at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:206)
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:149)
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:75)
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:811)
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:784)
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:789)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1181)
    ... 73 more
Caused by: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:996)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3887)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3823)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2435)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2582)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2530)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1907)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2141)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2077)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2062)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:208)
    ... 94 more

The issue is in your shared DAO ancestor in the line 问题出在您的共享DAO祖先中

getEntityManager().clear();

first, you should rarely, if ever, call clear, and it should not be on every save, as clear attempts to remove the entity cache. 首先,您应该很少(如果有的话)调用clear,并且每次保存时都不应调用clear,因为clear会尝试删除实体缓存。

second, in this particular case, you attempt to call clear on a changed entity, which means that it's going to wait and see if you commit the transaction to whether or not to update the DB, or throw away the change. 其次,在这种特殊情况下,您尝试对已更改的实体调用clear,这意味着它将等待,看看您是否将事务提交给是否要更新数据库或放弃更改。 This is where the entity lock happens. 这是实体锁定发生的地方。

Try rewriting the save() method of AbstractDAO to this: 尝试将AbstractDAOsave()方法重写为此:

@Override   
public T save(T object) {
    getEntityManager().persist(object);
    getEntityManager().flush();
    getEntityManager().refresh(object);
    return object;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM