Uploaded image for project: 'Derby'
  1. Derby
  2. DERBY-6999

tooMuchContentionException thrown during concurrent inserts

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Open
    • Major
    • Resolution: Unresolved
    • 10.13.1.1, 10.14.2.0
    • None
    • JDBC
    • None
    • hibernate + spring
    • Repro attached
    • Crash, Performance

    Description

      During many concurrent inserts derby throws tooMuchContentionExpection.

      org.hibernate.exception.LockAcquisitionException: could not execute statement
          at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:75)
          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.id.insert.AbstractSelectingDelegate.performInsert(AbstractSelectingDelegate.java:45)
          at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3037)
          at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3628)
          at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:81)
          at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:645)
          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:359)
          at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:292)
          at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:200)
          at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:131)
          at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:192)
          at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:38)
          at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:177)
          at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:32)
          at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:73)
          at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:709)
          at org.hibernate.internal.SessionImpl.save(SessionImpl.java:701)
          at org.hibernate.internal.SessionImpl.save(SessionImpl.java:696)
          at sk.palo.liska.ServiceImpl.saveTable(ServiceImpl.java:31)
          at sun.reflect.GeneratedMethodAccessor36.invoke(Unknown Source)
          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:343)
          at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:197)
          at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
          at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:294)
          at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)
          at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
          at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
          at com.sun.proxy.$Proxy42.saveTable(Unknown Source)
          at sk.palo.liska.ServiceImplTest.lambda$insertTasks$4(ServiceImplTest.java:237)
          at java.util.concurrent.FutureTask.run(FutureTask.java:266)
          at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
          at java.lang.Thread.run(Thread.java:748)
      Caused by: java.sql.SQLTransactionRollbackException: A lock could not be obtained within the time requested
          at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
          at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
          at org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown Source)
          at org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown Source)
          at org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown Source)
          at org.apache.derby.impl.jdbc.ConnectionChild.handleException(Unknown Source)
          at org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(Unknown Source)
          at org.apache.derby.impl.jdbc.EmbedPreparedStatement.executeStatement(Unknown Source)
          at org.apache.derby.impl.jdbc.EmbedPreparedStatement.executeLargeUpdate(Unknown Source)
          at org.apache.derby.impl.jdbc.EmbedPreparedStatement.executeUpdate(Unknown Source)
          at org.apache.commons.dbcp2.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:98)
          at org.apache.commons.dbcp2.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:98)
          at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:175)
          ... 37 common frames omitted
      Caused by: org.apache.derby.iapi.error.StandardException: A lock could not be obtained within the time requested
          at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
          at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
          at org.apache.derby.impl.sql.catalog.SequenceUpdater.tooMuchContentionException(Unknown Source)
          at org.apache.derby.impl.sql.catalog.SequenceUpdater.getCurrentValueAndAdvance(Unknown Source)
          at org.apache.derby.impl.sql.catalog.DataDictionaryImpl.getCurrentValueAndAdvance(Unknown Source)
          at org.apache.derby.impl.sql.execute.BaseActivation.getCurrentValueAndAdvance(Unknown Source)
          at org.apache.derby.impl.sql.execute.InsertResultSet.getSetAutoincrementValue(Unknown Source)
          at org.apache.derby.impl.sql.execute.BaseActivation.getSetAutoincrementValue(Unknown Source)
          at org.apache.derby.exe.ac292a80bcx0164x1c65xaecfx00000d3715680.e0(Unknown Source)
          at org.apache.derby.impl.services.reflect.DirectCall.invoke(Unknown Source)
          at org.apache.derby.impl.sql.execute.RowResultSet.getNextRowCore(Unknown Source)
          at org.apache.derby.impl.sql.execute.NormalizeResultSet.getNextRowCore(Unknown Source)
          at org.apache.derby.impl.sql.execute.DMLWriteResultSet.getNextRowCore(Unknown Source)
          at org.apache.derby.impl.sql.execute.InsertResultSet.getNextRowCore(Unknown Source)
          at org.apache.derby.impl.sql.execute.InsertResultSet.open(Unknown Source)
          at org.apache.derby.impl.sql.GenericPreparedStatement.executeStmt(Unknown Source)
          at org.apache.derby.impl.sql.GenericPreparedStatement.execute(Unknown Source)
          ... 44 common frames omitted
      

      Setup: transaction management with spring + hibernate.

      Test code is here: https://github.com/paloliska/tooMuchContention

       - master branch has derby version 10.13.1.1, hibernate 4.3.11, and spring 4.3.7.

       - latest_dependencies branch has latest versions.

      Run test with:

      mvn test
      

      Tests are not stable. But with proper setup, you could make to fail all of them. Depends on current hardware, load. In Tests also could be set number of threads and timeout for each test. Test will run until timeout or fail.

      Attachments

        Issue Links

          Activity

            People

              Unassigned Unassigned
              Liška Pavol Liška
              Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

                Created:
                Updated: