我遇到了错误。有人可以帮我吗?我正在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);
}
}
}