0

我在Spring项目中工作,使用mybatis 3and oracle 11g

我试图rollback transactions在错误发生时。但是,回滚似乎不起作用。

源代码如下:

应用程序上下文.xml

    <tx:annotation-driven transaction-manager="transactionManager"/>
    <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

服务

int changeLimitSrcAcc(String src_acctno,String dest_acctno, String amt);

服务实现

    @Override
    public int changeLimitSrcAcc(String src_acctno, String dest_acctno,
            String amt) {
        int result = 0;
        SqlSessionFactory sqlMapper = MyBatisService.getSessionFactory();
        SqlSession sqlSession = sqlMapper.openSession();
        CustomerAccountMapper mapper = sqlSession
                .getMapper(CustomerAccountMapper.class);

        try {
            int result1 = mapper.changeLimitSrcAcc(src_acctno, amt);
            int result2 = mapper.changeLimitDescAcc(dest_acctno, amt);
            if (result1 != 1 || result2 != 1)
                throw new Exception("Error happened");
            else result = 1;
            sqlSession.commit();
        } catch (Exception e) {
            System.out.println(e.getMessage());
            sqlSession.rollback();
        } finally {
            sqlSession.close();
        }
        return result;
    }

我也试过rollbacktransaction,但它仍然承诺。

我在 Mybatis 主页上阅读,它说@transaction不需要注释。我也放了annotations,什么也没发生。

有什么解决办法吗?

谢谢。

4

1 回答 1

1

您有两种管理交易的方式:

  1. Declarative Transaction Management@Transactional注解)
  2. Programmatic Transaction Management(手动提交/回滚)

你试着两者都做。决定 - 让 Spring 管理事务 -使用 Spring config 配置 myBatis - 更简单的方式或手动创建DefaultTransactionDefinition等。

于 2017-03-21T00:56:26.203 回答