javax.persistence.PersistenceException:org.hibernate.exception.LockAcquisitionException:无法执行语句

时间:2020-05-28 19:11:56

标签: java sql-server hibernate jpa spring-data-jpa

我遇到了错误。有人可以帮我吗?我正在3个不同的线程中运行更新。大多是同一记录。但我仍然看到此错误。当我对1个线程执行相同操作时,我看不到此错误

SRK_GENERAL_002 org.hibernate.exception.LockAcquisitionException:无法执行语句 org.mule.component.ComponentException:javax.persistence.PersistenceException:org.hibernate.exception.LockAcquisitionException:无法执行语句。导致异常的组件是:DefaultJavaComponent {updatejourney.update_db.component.1769321531}。 javax.persistence.PersistenceException:org.hibernate.exception.LockAcquisitionException:无法执行语句。导致异常的组件是:DefaultJavaComponent {updatejourney.update_db.component.1769321531}。 javax.persistence.PersistenceException:org.hibernate.exception.LockAcquisitionException:无法执行语句 org.mule.component.ComponentException:javax.persistence.PersistenceException:org.hibernate.exception.LockAcquisitionException:无法执行语句。导致异常的组件是:DefaultJavaComponent {updatejourney.update_db.component.1769321531}。 在org.mule.component.DefaultComponentLifecycleAdapter.invoke(DefaultComponentLifecycleAdapter.java:355) 在org.mule.component.AbstractJavaComponent.invokeComponentInstance(AbstractJavaComponent.java:82) 在org.mule.component.AbstractJavaComponent.doInvoke(AbstractJavaComponent.java:73)

====

原因:javax.persistence.PersistenceException:org.hibernate.exception.LockAcquisitionException:无法执行语句 在org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1692) 在org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1602) 在org.hibernate.jpa.spi.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:1700) 在org.hibernate.jpa.spi.AbstractQueryImpl.executeUpdate(AbstractQueryImpl.java:70) 在com.srk.esb.orm.update.builder.UpdateJourney.createJourneyRoutePoints(UpdateJourney.java:3224)

=====

由以下原因引起:org.hibernate.exception.LockAcquisitionException:无法执行语句 在org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:123) 在org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42) 在org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111) 在org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:97) 在org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:207) 在org.hibernate.hql.internal.ast.exec.BasicExecutor.doExecute(BasicExecutor.java:91) 在org.hibernate.hql.internal.ast.exec.BasicExecutor.execute(BasicExecutor.java:60) 在org.hibernate.hql.internal.ast.QueryTranslatorImpl.executeUpdate(QueryTranslatorImpl.java:429) 在org.hibernate.engine.query.spi.HQLQueryPlan.performExecuteUpdate(HQLQueryPlan.java:374) 在org.hibernate.internal.SessionImpl.executeUpdate(SessionImpl.java:1361) 在org.hibernate.internal.QueryImpl.executeUpdate(QueryImpl.java:102) 在org.hibernate.jpa.internal.QueryImpl.internalExecuteUpdate(QueryImpl.java:405) 在org.hibernate.jpa.spi.AbstractQueryImpl.executeUpdate(AbstractQueryImpl.java:61) ...更多79 引起原因:com.microsoft.sqlserver.jdbc.SQLServerException:事务(进程ID 64)在锁资源上被另一个进程死锁,并被选择为死锁受害者。重新运行事务。 在com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:216) 在com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1515) 在com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedSt

=====

下面是我的代码

private void createJourneyBS(Journey journey, JourneyRoute journeyRouteOld, RouteType routeType, Integer version) {

    List<RoutePointType> routePointTypes = routeType.getRoutePoint();

    for (RoutePointType routePointType : routePointTypes) {

        JourneyBSBuilder builderivs = builderHelper.getJourneyBSBuilder(routePointType);
        JourneyBS KRTT = builderivs.build();
        List<JourneyRouteTime> timeList = getJourneyRouteTime(journey, journeyRouteOld, routePointType);

        Query query = entityManager.createQuery("UPDATE JourneyBS jrp SET "
        + "jrp.type  = :type, "
        + "jrp.lastUpdatedTime = :lastUpdatedTime, "
        + "jrp.hasEnteringTime = :hasEnteringTime, "
        + "jrp.islock = :islock, "
        + "jrp.isAcsPoint = :isAcsPoint, "
        + "jrp.description = :description, "
        + "jrp.version = :version "
        + "Where jrp.journey.journeyId = :journeyId and jrp.rPN = :rPN and jrp.sequenceNr = :sequenceNr");


        query.setParameter("type",  KRTT.getType());
        query.setParameter("lastUpdatedTime",  KRTT.getLastUpdatedTime());

        query.setParameter("hasEnteringTime", KRTT.getHasEnteringTime());
        query.setParameter("islock",  KRTT.getIslock());

        query.setParameter("isAcsPoint",  KRTT.getIsAcsPoint());
        query.setParameter("description", KRTT.getDescription());
        query.setParameter("version", version);

        query.setParameter("journeyId", journey.getJourneyId());

        query.setParameter("rPN",  KRTT.getrPN());
        query.setParameter("sequenceNr", KRTT.getSequenceNr());

        int res = query.executeUpdate();

        if(res == 1){

            updateTimeList(timeList, KRTT, journey, version);
        }

        if(res == 0){

            KRTT.setJourneyRoute(journeyRouteOld);
            KRTT.setJourney(journey);
            KRTT.setVersion(version);

            genericDAO.persist(KRTT);
            createJourneyRouteTime(journey, KRTT,  routePointType, version);
        }


    }
}

0 个答案:

没有答案