Springブート、spring-data-jpaに基づく大規模なREST Webアプリケーション。私は、ParentEntity
とManyToOneの関係を持つPersonEntity
を持っています。関係の所有者はPersonEntity
で、彼のテーブルにはparentId
があります。エンティティを保存するときのConcurrentModificationException
多くのSoapUI同時テストを実行すると、ランダムに1つの場所にあるConcurrentModificationException
がスローされていることがわかりました(ランダムに、実際には1年以上続いていますが、別のスレッドから同時にアクセスしています
@Override
@Transactional
public void disconnectPersonFromParent(final String parentId, final String personId) {
//throw NotFound when null from repo
final PersonEntity personEntity = personService.getPerson(personId);
//throw NotFound when null from repo
final ParentEntity parentEntity = parentService.getParent(parentId);
if(parentEntity.equals(personEntity.getParent())) {
personEntity.setParent(null);
//Addresses comes from parent, when we disconnecting we have disconnect addresses also
personEntity.setAddresses(new HashSet<>());
personRepository.save(personEntity);
}
}
スタックトレース:
||ERROR|http-nio-auto-1-exec-487|error|[TransactionSystemExceptionMapper:353]|Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Error while committing the transaction org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Error while committing the transaction
Caused by: javax.persistence.RollbackException: Error while committing the transaction
at org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:94)
at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:517)
... 130 more
Caused by: java.util.ConcurrentModificationException
at java.util.LinkedHashMap$LinkedHashIterator.nextNode(LinkedHashMap.java:719)
at java.util.LinkedHashMap$LinkedEntryIterator.next(LinkedHashMap.java:752)
at java.util.LinkedHashMap$LinkedEntryIterator.next(LinkedHashMap.java:750)
at org.hibernate.internal.util.collections.IdentityMap.entryArray(IdentityMap.java:163)
at org.hibernate.internal.util.collections.IdentityMap.concurrentEntries(IdentityMap.java:75)
at org.hibernate.event.internal.AbstractFlushingEventListener.postFlush(AbstractFlushingEventListener.java:379)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:57)
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1258)
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:425)
at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:177)
at org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:77)
... 131 more
はそれがプロであるという問題が発生する)
コードコードの邪魔?どうすればそれを避けることができますか?
あなたは正しいです、PersonEntityインスタンスが別のスレッドによって更新され、DBに保存されました。そのため、このエラーが発生しています。さまざまな理由で行がロックされている、テーブルがロックされている – vhula
[OK]を、どうすれば解決できるかを質問します。 – ByeBye