Unable to apply change 'type: removal, object: JiraCustomField' on JIRA 7.2

Symptoms: 

java.util.concurrent.ExecutionException: com.botronsoft.jira.rollout.impl.merge.MergeException: Unable to apply change 'type: removal, object: JiraCustomField#customfield_10000_Date Needed_com.atlassian.jira.plugin.system.customfieldtypes:datepicker, target object: JiraConfigurationRoot#root, feature: customFields'
at java.util.concurrent.FutureTask.report(FutureTask.java:122)
at java.util.concurrent.FutureTask.get(FutureTask.java:192)
at com.botronsoft.jira.rollout.impl.DeploymentProgressMonitor.getResult(DeploymentProgressMonitor.java:116)
at com.botronsoft.jira.rollout.impl.DeploymentProgressMonitor.getResult(DeploymentProgressMonitor.java:33)
at com.botronsoft.jira.rollout.rest.internal.DeploymentResource.createResponse(DeploymentResource.java:379)
at com.botronsoft.jira.rollout.rest.internal.DeploymentResource.getDeploymentOperation(DeploymentResource.java:299)
Caused by: com.botronsoft.jira.rollout.impl.merge.MergeException: Unable to apply change 'type: removal, object: JiraCustomField#customfield_10000_Date Needed_com.atlassian.jira.plugin.system.customfieldtypes:datepicker, target object: JiraConfigurationRoot#root, feature: customFields'
at com.botronsoft.jira.rollout.impl.merge.AbstractMergeAdapter.notifyChanged(AbstractMergeAdapter.java:77)
at com.botronsoft.jira.rollout.impl.merge.di.CacheRefreshInterceptor.invoke(CacheRefreshInterceptor.java:30)
at com.botronsoft.jira.rollout.impl.merge.MainMergeAdapter.notifyChanged(MainMergeAdapter.java:63)
at org.eclipse.emf.common.notify.impl.BasicNotifierImpl.eNotify(BasicNotifierImpl.java:374)
at org.eclipse.emf.ecore.util.EcoreEList.dispatchNotification(EcoreEList.java:249)
at org.eclipse.emf.common.notify.impl.NotifyingListImpl.remove(NotifyingListImpl.java:713)
at org.eclipse.emf.common.util.AbstractEList.remove(AbstractEList.java:460)
at org.eclipse.emf.ecore.util.EcoreUtil.remove(EcoreUtil.java:3155)
at org.eclipse.emf.compare.merge.ReferenceChangeMerger.removeFromTarget(ReferenceChangeMerger.java:530)
at org.eclipse.emf.compare.merge.ReferenceChangeMerger.copyLeftToRight(ReferenceChangeMerger.java:82)
at org.eclipse.emf.compare.merge.AbstractMerger.mergeDiff(AbstractMerger.java:132)
at org.eclipse.emf.compare.merge.AbstractMerger.mergeRequires(AbstractMerger.java:111)
at org.eclipse.emf.compare.merge.ReferenceChangeMerger.copyLeftToRight(ReferenceChangeMerger.java:73)
at org.eclipse.emf.compare.merge.BatchMerger.copyAllLeftToRight(BatchMerger.java:97)
at com.botronsoft.jira.rollout.impl.JiraConfigurationServiceImpl.importConfiguration(JiraConfigurationServiceImpl.java:380)
at com.botronsoft.jira.rollout.impl.jobs.DeploymentJob.call(DeploymentJob.java:107)
at com.botronsoft.jira.rollout.impl.jobs.DeploymentJob.call(DeploymentJob.java:39)
at com.botronsoft.jira.rollout.impl.jobs.JobSchedulingServiceImpl$ClusterTask.call(JobSchedulingServiceImpl.java:56)
Caused by: com.querydsl.core.QueryException: Caught JdbcSQLException for delete from PUBLIC.fieldlayoutitem
where fieldlayoutitem.fieldidentifier = ?
at com.querydsl.sql.DefaultSQLExceptionTranslator.translate(DefaultSQLExceptionTranslator.java:50)
at com.querydsl.sql.Configuration.translate(Configuration.java:453)
at com.querydsl.sql.dml.SQLDeleteClause.execute(SQLDeleteClause.java:209)
at com.atlassian.jira.issue.managers.CachingCustomFieldManager.lambda$removeCustomFieldAssociations$10(CachingCustomFieldManager.java:457)
at com.atlassian.jira.database.DefaultQueryDslAccessor$1.lambda$execute$1(DefaultQueryDslAccessor.java:85)
at com.atlassian.jira.database.DatabaseAccessorImpl.executeQuery(DatabaseAccessorImpl.java:67)
at com.atlassian.jira.database.DefaultQueryDslAccessor$1.execute(DefaultQueryDslAccessor.java:84)
at com.atlassian.jira.issue.managers.CachingCustomFieldManager.removeCustomFieldAssociations(CachingCustomFieldManager.java:448)
at com.atlassian.jira.issue.managers.CachingCustomFieldManager.removeCustomField(CachingCustomFieldManager.java:436)
at com.botronsoft.jira.rollout.impl.merge.ConfigurationRootMergeAdapter.removeCustomField(ConfigurationRootMergeAdapter.java:975)
at com.botronsoft.jira.rollout.impl.merge.di.CacheRefreshInterceptor.invoke(CacheRefreshInterceptor.java:30)
at com.botronsoft.jira.rollout.impl.merge.ConfigurationRootMergeAdapter.removeFeature(ConfigurationRootMergeAdapter.java:762)
at com.botronsoft.jira.rollout.impl.merge.ConfigurationRootMergeAdapter.removeFeature(ConfigurationRootMergeAdapter.java:116)
at com.botronsoft.jira.rollout.impl.merge.AbstractMergeAdapter.notifyChanged(AbstractMergeAdapter.java:68)
... 17 more
Caused by: org.h2.jdbc.JdbcSQLException: Timeout trying to lock table ; SQL statement:
delete from PUBLIC.fieldlayoutitem
where fieldlayoutitem.fieldidentifier = ? [50200-185]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
at org.h2.message.DbException.get(DbException.java:168)
at org.h2.command.Command.filterConcurrentUpdate(Command.java:301)
at org.h2.command.Command.executeUpdate(Command.java:256)
at org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:157)
at org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:143)
at org.apache.tomcat.dbcp.dbcp2.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:97)
at org.apache.tomcat.dbcp.dbcp2.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:97)
at com.querydsl.sql.dml.SQLDeleteClause.execute(SQLDeleteClause.java:195)
... 28 more
Caused by: org.h2.jdbc.JdbcSQLException: Concurrent update in table "FIELDLAYOUTITEM": another transaction has updated or deleted the same row [90131-185]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
at org.h2.message.DbException.get(DbException.java:168)
at org.h2.mvstore.db.MVSecondaryIndex.remove(MVSecondaryIndex.java:249)
at org.h2.mvstore.db.MVTable.removeRow(MVTable.java:610)
at org.h2.command.dml.Delete.update(Delete.java:94)
at org.h2.command.CommandContainer.update(CommandContainer.java:78)
at org.h2.command.Command.executeUpdate(Command.java:254)
... 33 more
Caused by: java.lang.IllegalStateException: Entry is locked [1.4.185/101]
at org.h2.mvstore.DataUtils.newIllegalStateException(DataUtils.java:773)
at org.h2.mvstore.db.TransactionStore$TransactionMap.set(TransactionStore.java:1012)
at org.h2.mvstore.db.TransactionStore$TransactionMap.remove(TransactionStore.java:970)
at org.h2.mvstore.db.MVSecondaryIndex.remove(MVSecondaryIndex.java:243)
... 37 more

Cause:

Since JIRA 7.2, for many operations new db connections are opened and this breaks transactions.

Resolution:

Custom fields are deleted during restore, so a solution is to temporary disable transactions from the CMJ UI.