2016-03-10 8 views
0

Я работаю в Spring проекте, используя mybatis 3 и oracle 11g.Mybatis sqlsession не может откатиться

Я пробовал rollback transactions, когда произошли ошибки. Однако откат, похоже, не работает.

Исходный код ниже:

applicationContext.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); 

ServiceImpl

@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; 
    } 

Я также пробовал rollback один transaction, но он по-прежнему совершается.

Я прочитал на домашней странице Mybatis и сказал, что @transaction аннотации не нужны. Я также поставил annotations, и ничего не произошло.

Любые решения?

Спасибо.

+0

Лично я бы попробовал аннотацию '@ Transactional' и позволю методу исключить исключение вместо того, чтобы его поймать. В этом случае вам не нужно «SqlSessionFactory» или «SqlSession», но вы можете напрямую вводить картупер, а Spring должен заботиться обо всем остальном. См. Документацию Spring: http://docs.spring.io/autorepo/docs/spring/4.2.x/spring-framework-reference/html/transaction.html –

+0

Вы объявляете менеджера транзакций вне Mybatis, поэтому вы не можете используйте SqlSession commit() или rollback(). Вместо этого используйте метод фиксации/отката, связанный с менеджером весенних транзакций, как говорит Флориан Шэц. – jmad

+0

Использование @Transactional в методах Сервиса должно работать с уверенностью. Ну, это сработало для меня хорошо. – Lucky

ответ

0

У вас есть 2 способа управления транзакциями:

  1. Declarative Transaction Management (@Transactional аннотацию)
  2. Programmatic Transaction Management (вручную делать совершающие/откат)

Вы пытаетесь сделать так. Решите - либо пусть Spring управляет транзакциями - configure myBatis with Spring config - более простой способ или manually create DefaultTransactionDefinition и т. Д.