Illegal attempt to enlist multiple 1PC XAResources

We have several transaction managers ( WebsphereUOWTransactionManager and DatasourceTransactionManager ) and use Mybatis and NamedParameterJdbcTemplate (outdated code)

The code used to work and the changes made consist of moving @Transactional to the service level and removing sqlsession.commit from mybatis code.

But now there is a problem when the executable code ( JdbcTemplate ) is executed.

Mistake

 20170427 19:22:02.045 [SimpleThreadPoolWorker-2] DEBUG osbcrdJdbcStepExecutionDao # Truncating long message before update of StepExecution, original message is: org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL [ UPDATE JOB_RUN SET SYS_RUN_STUS_CD = ?, UPDT_USER_ID = 'SYSTEM', REC_UPDT_TS = CURRENT_TIMESTAMP WHERE JOB_RUN_ID = ? ]; SQL state [null]; error code [0]; enlist: caught Exception; nested exception is java.sql.SQLException: enlist: caught Exception at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:84) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:660) at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:909) at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:933) at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(NamedParameterJdbcTemplate.java:313) at com.abc.common.dao.jdbc.JobRunJdbcDao.updateJobStatus(JobRunJdbcDao.java:199) at com.abc.common.dao.jdbc.JobRunJdbcDao.updateJobStatus(JobRunJdbcDao.java:193) at com.abc.bpe.core.InitializingTasklet.execute(InitializingTasklet.java:59) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) at org.springframework.transaction.interceptor.TransactionAspectSupport$1.doInTransaction(TransactionAspectSupport.java:304) at org.springframework.transaction.jta.WebSphereUowTransactionManager$UOWActionAdapter.run(WebSphereUowTransactionManager.java:347) at com.ibm.ws.uow.embeddable.EmbeddableUOWManagerImpl.runUnderCurrentUOW(EmbeddableUOWManagerImpl.java:954) at com.ibm.ws.uow.embeddable.EmbeddableUOWManagerImpl.runUnderUOW(EmbeddableUOWManagerImpl.java:370) at org.springframework.transaction.jta.WebSphereUowTransactionManager.execute(WebSphereUowTransactionManager.java:290) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:298) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) at com.sun.proxy.$Proxy118.execute(Unknown Source) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:133) at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:121) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) at com.sun.proxy.$Proxy106.execute(Unknown Source) at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:406) at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:330) at org.springframework.transaction.jta.WebSphereUowTransactionManager$UOWActionAdapter.run(WebSphereUowTransactionManager.java:347) at com.ibm.ws.uow.embeddable.EmbeddableUOWManagerImpl.runUnderNewUOW(EmbeddableUOWManagerImpl.java:775) at com.ibm.ws.uow.embeddable.EmbeddableUOWManagerImpl.runUnderUOW(EmbeddableUOWManagerImpl.java:368) at org.springframework.transaction.jta.WebSphereUowTransactionManager.execute(WebSphereUowTransactionManager.java:290) at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:127) at org.springframework.batch.core.step.tasklet.TaskletStep$2.doInChunkContext(TaskletStep.java:271) at org.springframework.batch.core.scope.context.StepContextRepeatCallback.doInIteration(StepContextRepeatCallback.java:77) at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:368) at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:215) at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:144) at org.springframework.batch.core.step.tasklet.TaskletStep.doExecute(TaskletStep.java:257) at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:198) at org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:148) at org.springframework.batch.core.job.flow.JobFlowExecutor.executeStep(JobFlowExecutor.java:64) at org.springframework.batch.core.job.flow.support.state.StepState.handle(StepState.java:67) at org.springframework.batch.core.job.flow.support.SimpleFlow.resume(SimpleFlow.java:165) at org.springframework.batch.core.job.flow.support.SimpleFlow.start(SimpleFlow.java:144) at org.springframework.batch.core.job.flow.FlowJob.doExecute(FlowJob.java:134) at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:304) at com.abc.bpe.core.support.CompositeJobLauncher.runJob(CompositeJobLauncher.java:207) at com.abc.des.bpe.core.support.CompositeJobLauncher$1.run(CompositeJobLauncher.java:119) at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:525) Caused by: java.sql.SQLException: enlist: caught Exception at com.ibm.ws.rsadapter.AdapterUtil.toSQLException(AdapterUtil.java:1000) at com.ibm.ws.rsadapter.jdbc.WSJdbcConnection.beginTransactionIfNecessary(WSJdbcConnection.java:513) at com.ibm.ws.rsadapter.jdbc.WSJdbcConnection.prepareStatement(WSJdbcConnection.java:2373) at com.ibm.ws.rsadapter.jdbc.WSJdbcConnection.prepareStatement(WSJdbcConnection.java:2339) at org.springframework.jdbc.core.PreparedStatementCreatorFactory$PreparedStatementCreatorImpl.createPreparedStatement(PreparedStatementCreatorFactory.java:238) at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:638) ... 60 more Caused by: javax.resource.ResourceException: enlist: caught Exception at com.ibm.ejs.j2c.LocalTransactionWrapper.enlist(LocalTransactionWrapper.java:585) at com.ibm.ejs.j2c.ConnectionManager.lazyEnlist(ConnectionManager.java:1726) at com.ibm.ws.rsadapter.spi.WSRdbManagedConnectionImpl.lazyEnlist(WSRdbManagedConnectionImpl.java:2084) at com.ibm.ws.rsadapter.jdbc.WSJdbcConnection.beginTransactionIfNecessary(WSJdbcConnection.java:468) ... 64 more Caused by: java.lang.IllegalStateException: Illegal attempt to enlist multiple 1PC XAResources at com.ibm.tx.jta.impl.RegisteredResources.enlistResource(RegisteredResources.java:441) at com.ibm.tx.jta.impl.TransactionImpl.enlistResource(TransactionImpl.java:2252) at com.ibm.tx.jta.embeddable.impl.EmbeddableTranManagerSet.enlistOnePhase(EmbeddableTranManagerSet.java:202) at com.ibm.ws.transaction.services.TransactionManagerService.enlistOnePhase(TransactionManagerService.java:382) at com.ibm.ejs.j2c.LocalTransactionWrapper.enlist(LocalTransactionWrapper.java:501) ... 67 more 

I added @Transactional to the InitializingTasklet.execute (...) method

Any help on this is greatly appreciated. Also, if any other code is required, let us know.

thanks

EDIT 3:

serviceBeans.xml

  <tx:advice id="txServiceAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="runJob" propagation="REQUIRED" rollback-for="Throwable" isolation="READ_COMMITTED" /> </tx:attributes> </tx:advice> <!-- commented the below line now and change the transactionManager--> <!-- <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> --> <bean id="txManager" class="org.springframework.transaction.jta.WebSphereUowTransactionManager" /> <tx:annotation-driven transaction-manager="txManager" /> 

EDIT 2:

I have removed several transaction managers and now I only have WebspereUOWTransactionManager

EDIT

Additional code:

BatchServiceImpl (Added by @Transactional):

 @Override @Transactional(value = "transactionManager", rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW) public void launchJob(JobLaunchRequest request) throws ServiceException { try { logger.info("Launching job: " + request.getJobParameters().toString()); jobLauncher.runAll(request.getJobParameters()); } catch (Exception e) { throw new RuntimeException(e); } } 

Code that calls DAO:

 public class ParameterBasedCompositeJobLauncher implements CompositeJobLauncher, InitializingBean { public Collection<JobExecution> runAll(final Collection<JobExecutionParameters> jobParameterSet) throws JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException, JobParametersInvalidException { .... jobRunDao.updateJobStatus(batchId, jobRunStatus); .... } } 

applicationContext.xml

 <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="add*" propagation="REQUIRES_NEW" rollback-for="Exception" isolation="READ_COMMITTED" /> <tx:method name="update*" propagation="REQUIRES_NEW" rollback-for="Exception" isolation="READ_COMMITTED" /> </tx:attributes> </tx:advice> 

spring -dataSource.xml

 <bean id="transactionManager" class="org.springframework.transaction.jta.WebSphereUowTransactionManager" /> <tx:annotation-driven transaction-manager="transactionManager" /> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate" c:dataSource-ref="dataSource" /> 

spring -launch-context.xml

 <bean id="jobLauncher" class="com.abc.core.support.ParameterBasedCompositeJobLauncher"> <property name="jobRepository" ref="jobRepository" /> <property name="taskExecutor" ref="taskExecutor"/> <property name="jobLocator" ref="jobRegistry" /> <property name="jobRunDao" ref="jobRunDao"/> <property name="forwardJobClient" ref="integration-forwardJobClient"/> <property name="responseFileGenerator" ref="responseFileGenerator"/> </bean> <bean class="org.springframework.batch.core.configuration.support.JobRegistryBeanPostProcessor"> <property name="jobRegistry" ref="jobRegistry"/> </bean> <bean id="jobRepository" p:dataSource-ref="dataSource" p:transactionManager-ref="transactionManager" p:lobHandler-ref="lobHandler" p:tablePrefix="${SCHEMA}.BATCH_" p:isolationLevelForCreate="ISOLATION_READ_COMMITTED" class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean"/> 
+7
spring spring-transactions transactional jdbctemplate mybatis
source share

No one has answered this question yet.

See similar questions:

eleven
Calling @Transactional methods from another thread (Runnable)

or similar:

4
Multiple Transaction Managers NoUniqueBeanDefinitionException
2
Spring BeanCreationException: Bean instance through factory method failed nested exception
2
Transfer transaction manager from external attribute @Transactional
one
NotWritablePropertyException: the bean property 'dataSource' is not writable or has the wrong setter method
one
Spring JdbcTemplate Insert Throws Uncategorized SQLException
0
Optimistic locking when performing an update step in Spring Batch
0
Failed to find out what is happening with JdbcTemplateSupport
0
Spring JDBCTemplate - Concurrent Calls
0
Java Standalone (Console) application - org.hibernate.LazyInitializationException: failed to initialize proxy - no session
0
can i configure Spring jpa hibernate without transaction manager?

All Articles