具有任务执行程序的jdbc轮询器的事务语义

时间:2014-02-26 10:32:18

标签: jdbc spring-integration

jdbc:inbound-channel-adapter 在使用任务执行程序时的事务行为是什么,如下面的代码所示:

<task:executor id="pollerPool" pool-size="10" queue-capacity="1000" />
<int-jdbc:inbound-channel-adapter id="pollingAdapter"
  channel="..." data-source="..." auto-startup="true" query="..." 
  row-mapper="..." update="..." max-rows-per-poll="100">
  <int:poller fixed-rate="50000" task-executor="pollerPool">
    <int:transactional transaction-manager="..."
      isolation="DEFAULT" propagation="REQUIRED" read-only="false" timeout="1000"/>
  </int:poller>
</int-jdbc:inbound-channel-adapter>

显然,使用任务执行器将启动一个新事务,但这不是问题,因为jdbc轮询器是管道的开头。但是,管道下游的组件是否会参与同一笔交易?这很重要,因为如果没有,jdbc:inbound-channel-adapter的update语句如果在该行下面出现故障,将不会回滚。

1 个答案:

答案 0 :(得分:1)

正确。轮询任务AbstractPollingEndpoint#createPoller()包含TransactionInterceptor,并且与提供的TaskExecutor无关。 换句话说:从JDBC轮询消息的线程在事务边界内。 并且该事务一直存在,直到下游流程结束其工作或您将消息转移到另一个线程,例如,一些执行者频道。

不要忘记该事务是单线程的。

有关详细信息,请查看此处:http://docs.spring.io/spring-integration/docs/3.0.1.RELEASE/reference/html/transactions.html