Spring batch 弹簧批和JTA
我使用的是spring batch 2.1.9。此版本是否支持JTA事务?我有一个包含多个步骤的批处理作业定义。这些步骤中只有一个与工作单元中的多个数据源交互 是否可以将JtaTransactionManager应用于此步骤?我遇到以下异常,当SpringBatch尝试更新表中的元数据信息时,似乎会发生这种情况Spring batch 弹簧批和JTA,spring-batch,jta,Spring Batch,Jta,我使用的是spring batch 2.1.9。此版本是否支持JTA事务?我有一个包含多个步骤的批处理作业定义。这些步骤中只有一个与工作单元中的多个数据源交互 是否可以将JtaTransactionManager应用于此步骤?我遇到以下异常,当SpringBatch尝试更新表中的元数据信息时,似乎会发生这种情况 由java.sql.SQLException引起 无法在分布式事务中调用Connection.commit。提交分布式事务时,事务管理器将提交资源管理器。。 我是否可以在Jta级别/
由java.sql.SQLException引起
无法在分布式事务中调用Connection.commit。提交分布式事务时,事务管理器将提交资源管理器。。
我是否可以在Jta级别/spring批处理设置任何属性来避免这种情况
如果不是步骤,如果我将JtaTxnMgr设置为作业级别,它会工作吗?我会避免这种情况,因为其他步骤不需要XA感知txn
org.springframework.batch.core.step.fatalstep执行异常:
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.doInitation(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.TaskExecutionPartitionHandler$1.call(TaskExecutionPartitionHandler.java:120)
在
org.springframework.batch.core.partition.support.TaskExecutionPartitionHandler$1.call(TaskExecutionPartitionHandler.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。交易
管理器将在分发资源时提交资源管理器
事务已提交。在
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.TransactionSpectSupport.commitTransactionAfterReturning(TransactionSpectSupport.java:387)
在
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
在
org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:172)
在
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
在$Proxy52.updateExecutionContext(未知源)处
org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:429)
... 由于java.sql.SQLException:无法调用
分布式事务中的Connection.commit。事务管理器
将在分布式事务启动时提交资源管理器
坚信的在
weblogic.jdbc.wrapper.JTSConnection.commit(JTSConnection.java:643)位于
org.springframework.jdbc.datasource.DataSourceTransactionManager.doCommit(DataSourceTransactionManager.java:268)
您可以在
tasklet
元素上指定事务管理器,允许您在一个步骤上使用一个事务管理器,在另一个步骤上使用其他事务管理器。请参见此处的第5.1.1节:我已将JtaTxmManager设置为tasklet的此属性,但我遇到了上述异常。有工作测试用例吗?这是否意味着插入/更新到步骤_执行和其他元数据表参与jta事务?一个步骤只有一个事务,因此是的,期望元数据表参与该事务。否则,如果发生故障,您的业务数据和存储库之间的状态将不一致。JobRepository定义使用的是DataSourceTransactionManager,而as步骤定义使用的是JtaTransactionManager。这会是个问题吗?我们有多个重用JobRepository的作业(不需要JtaTxnManager)。