首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Apache 2.13.1 MyBatis事务未回滚

Apache 2.13.1 MyBatis事务未回滚
EN

Stack Overflow用户
提问于 2014-08-18 14:26:38
回答 1查看 698关注 0票数 0

我有一个场景,首先要更新三个表中的一行,然后在每个表中插入一个新行。所有这些都应该出现在一批语句中,如果失败,则回滚。

代码语言:javascript
复制
Scenario below
e.g
statement1 = update table1;
statement2= update table2;
statement3 =update table3;
statement4 insert into table1;
statement5 insert into table2;
statement6 insert into tables3

骆驼社区对上述问题的回答是使用一个事务处理客户端,但现在的问题是,在其中一个MyBatis语句失败时,事务不会被回滚。

代码语言:javascript
复制
E.g. Exception case:The first two updates were not rolled back on failure of the third one below:

.to("mybatis:userMapper.updatePerson?statementType=Update") --- Passed
.to("mybatis:userMapper.updateCertificate8?statementType=Update") ---- Passed
.to("mybatis:userMapper.updateApplicationGroup?statementType=Update") ---- Failed

**`Am I missing anything?`**

    Camel Registry
            SimpleRegistry registry = new SimpleRegistry();
            DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(
            sqlSessionFactory.getConfiguration().getEnvironment()
                                                            .getDataSource());
                            registry.put("transactionManager",dataSourceTransactionManager);
                            SpringTransactionPolicy springTransactionPolicy = new SpringTransactionPolicy();
                            springTransactionPolicy.setTransactionManager(dataSourceTransactionManager);
                            springTransactionPolicy.setPropagationBehaviorName("PROPAGATION_REQUIRED");
                            registry.put("PROPAGATION_REQUIRED",springTransactionPolicy);
                            camelContext = new DefaultCamelContext(registry);
                            camelContext.setTracing(true);
                            camelContext.start();


    Camel Route:
                    onException(JMSException.class)
                    .handled(true).maximumRedeliveries(0).end();

                    onException(IllegalArgumentException.class)
                    .handled(true).maximumRedeliveries(0).rollback("Rolling back the IllegalArgumentException")
                    .end();

                    onException(PersistenceException.class)
                    .handled(true).maximumRedeliveries(0).rollback("Rolling back the transaction")
                    .end();

                    onException(RollbackExchangeException.class)
                    .handled(false).maximumRedeliveries(0).process(new CamelTibcoMessageProcessor())
                    .end();

 from("timer:foo?period=10000")
 .policy("PROPAGATION_REQUIRED")                                 .to("mybatis:userMapper.updatePerson?statementType=Update")
                                    .to("mybatis:userMapper.updateCertificate8?statementType=Update")
                                    .to("mybatis:userMapper.updateApplicationGroup?statementType=Update")
                                    .to("mybatis:userMapper.insertPersonFromCAMSCTSBridge?statementType=InsertList&executorType=batch")
                    .end(); 
EN

回答 1

Stack Overflow用户

发布于 2014-08-20 12:12:23

解决方案很简单--参见骆驼MyBatisMyBatis的链接。

将Spring配置转换为Java,您就拥有了它。下面是我做的事情,效果很好。

mybatis-spring maven依赖项添加到pom中。

代码语言:javascript
复制
**------------------Sample setup--------------------**

SimpleRegistry registry = new SimpleRegistry();
ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setDriverClass("oracle.jdbc.driver.OracleDriver");
cpds.setJdbcUrl("jdbc_url");
cpds.setUser("username");
cpds.setPassword("password");

TransactionAwareDataSourceProxy transactionAwareDataSourceProxy = new TransactionAwareDataSourceProxy(cpds);
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(transactionAwareDataSourceProxy);
registry.put("transactionManager",transactionManager);
ApplicationContext appContext = new ClassPathXmlApplicationContext();
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
                        factoryBean.setConfigLocation(appContext.getResource("mapper/your_mybatis_config.xml"));
factoryBean.setDataSource(cpds);

SpringTransactionPolicy  propagationRequired = new SpringTransactionPolicy();
propagationRequired.setTransactionManager(transactionManager);
propagationRequired.setPropagationBehaviorName("PROPAGATION_REQUIRED");
registry.put("PROPAGATION_REQUIRED",propagationRequired);

SpringTransactionPolicy  propagationRequiredNew= new SpringTransactionPolicy();
propagationRequiredNew.setTransactionManager(transactionManager);
propagationRequiredNew.setPropagationBehaviorName("PROPAGATION_REQUIRES_NEW");
registry.put("PROPAGATION_REQUIRES_NEW",propagationRequiredNew);

 camelContext = new DefaultCamelContext(registry);
camelContext.setTracing(true);
camelContext.start();

 MyBatisComponent component = new MyBatisComponent();
component.setSqlSessionFactory(factoryBean.getObject());
camelContext.addComponent("mybatis", component);
 camelContext.addRoutes(new SomeRoute()); 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25365712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档