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语句如果在该行下面出现故障,将不会回滚。
答案 0 :(得分:1)
正确。轮询任务AbstractPollingEndpoint#createPoller()
包含TransactionInterceptor
,并且与提供的TaskExecutor
无关。
换句话说:从JDBC轮询消息的线程在事务边界内。
并且该事务一直存在,直到下游流程结束其工作或您将消息转移到另一个线程,例如,一些执行者频道。
不要忘记该事务是单线程的。
有关详细信息,请查看此处:http://docs.spring.io/spring-integration/docs/3.0.1.RELEASE/reference/html/transactions.html