【发布时间】:2014-10-13 21:40:31
【问题描述】:
我正在使用 Spring Batch 2.1.9。此版本是否支持 JTA 事务?我有一个包含多个步骤的批处理作业定义。这些步骤中只有一个与工作单元中的多个数据源交互。
是否可以将 JtaTransactionManager 应用于这一步?我收到以下异常,当 Spring Batch 尝试更新表中的元数据信息时,似乎会发生这种情况。
Caused by java.sql.SQLException
Cannot call Connection.commit in distributed transaction. Transaction Manager will commit the resource manager when the distributed transaction is committed..
我可以在 Jta 级别/弹簧批次设置任何属性来避免这种情况吗?
如果没有步骤,如果我在作业级别设置 JtaTxnMgr 会起作用吗?我会避免这种情况,因为其他步骤不需要是 XA-Aware txn。
org.springframework.batch.core.step.FatalStepExecutionException: JobRepository 失败强制退出,状态未知 org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:441) 在 org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:131) 在 org.springframework.batch.core.step.tasklet.TaskletStep$2.doInChunkContext(TaskletStep.java:264) 在 org.springframework.batch.core.scope.context.StepContextRepeatCallback.doInIteration(StepContextRepeatCallback.java:76) 在 org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:367) 在 org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:214) 在 org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:143) 在 org.springframework.batch.core.step.tasklet.TaskletStep.doExecute(TaskletStep.java:250) 在 org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:195) 在 org.springframework.batch.core.partition.support.TaskExecutorPartitionHandler$1.call(TaskExecutorPartitionHandler.java:120) 在 org.springframework.batch.core.partition.support.TaskExecutorPartitionHandler$1.call(TaskExecutorPartitionHandler.java:118) 在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 在 java.util.concurrent.FutureTask.run(FutureTask.java:138) 在 java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 在 java.lang.Thread.run(Thread.java:619) 引起: org.springframework.transaction.TransactionSystemException:不能 提交 JDBC 事务;嵌套异常是 java.sql.SQLException: 无法在分布式事务中调用 Connection.commit。交易 Manager 将在分发时提交资源管理器 事务已提交。在 org.springframework.jdbc.datasource.DataSourceTransactionManager.doCommit(DataSourceTransactionManager.java:271) 在 org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:755) 在 org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:724) 在 org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:387) 在 org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 在 org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) 在 $Proxy52.updateExecutionContext(Unknown Source) 在 org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:429) ... 15 更多原因:java.sql.SQLException:无法调用 Connection.commit 在分布式事务中。事务管理器 当分布式事务完成时将提交资源管理器 坚定的。在 weblogic.jdbc.wrapper.JTSConnection.commit(JTSConnection.java:643) 在 org.springframework.jdbc.datasource.DataSourceTransactionManager.doCommit(DataSourceTransactionManager.java:268)
【问题讨论】:
标签: spring-batch jta