在交易骆驼路线中,我需要:
请注意,包变量仅在设置它的连接中可见-因此,我需要在此处使用“事务处理”。
以下是演示该问题的示例代码:
from("direct-vm:process")
.transacted()
.to("sql:call my_pack.set_v1('10')")
.to("sql:select my_pack.get_v1 from dual?outputType=StreamList")
.split(body()).streaming()
.log("${body}")
.end();
以上代码的结果为: GET_V1 = null
如果我评论“ .transacted()”,则会得到: GET_V1 = 10
如果我从sql中删除“ StreamList”选项并取消注释“ .transacted()”: GET_V1 = 10
问题:“事务处理”不能与sql组件的“ StreamList”选项一起使用吗?
其他信息:
如果我在多个线程中从路由上方开始,就像这样:
Map<String, String> map = new HashMap<>();
map.put("10", "10");
map.put("20", "20");
map.put("30", "30");
map.put("40", "40");
map.put("50", "50");
map.forEach((key, values) -> {
from("timer://runOnce?repeatCount=1")
.setHeader("key", constant(key))
.setHeader("value", constant(values))
.inOnly("seda:processParallel");
});
from("seda:processParallel?concurrentConsumers=5")
.to("direct:process");
from("direct:process")
//.transacted()
.to("sql:call my_pack.pset_v1(:#value)?dataSource=generalDataSource")
.to("sql:select :#key key, my_pack.get_v1 value from dual?outputType=StreamList")
.split(body()).streaming()
.to("log:row")
.end();
我会得到不一致的结果:
KEY=**20**, VALUE=**50**
KEY=**50**, VALUE=**40**
KEY=**40**, VALUE=**20**
KEY=**10**, VALUE=**30**
KEY=**30**, VALUE=**10**
事务管理器的配置如下所示:
@Bean
public DataSourceTransactionManager dataSourceTransactionManager(DataSource dataSource) {
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
dataSourceTransactionManager.setDataSource(dataSource);
return dataSourceTransactionManager;
}
答案 0 :(得分:0)
如果仅用于同一数据库,则不需要XA事务transacted() 通常会交换不同的资源,例如一个JMS,另一个数据库
答案 1 :(得分:0)
您能告诉我们如何定义transactionManager吗?特别是,您是否将此txManager绑定到了数据源?
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="generalDataSource"/>
</bean>