Я работаю в 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
, и ничего не произошло.
Любые решения?
Спасибо.
Лично я бы попробовал аннотацию '@ Transactional' и позволю методу исключить исключение вместо того, чтобы его поймать. В этом случае вам не нужно «SqlSessionFactory» или «SqlSession», но вы можете напрямую вводить картупер, а Spring должен заботиться обо всем остальном. См. Документацию Spring: http://docs.spring.io/autorepo/docs/spring/4.2.x/spring-framework-reference/html/transaction.html –
Вы объявляете менеджера транзакций вне Mybatis, поэтому вы не можете используйте SqlSession commit() или rollback(). Вместо этого используйте метод фиксации/отката, связанный с менеджером весенних транзакций, как говорит Флориан Шэц. – jmad
Использование @Transactional в методах Сервиса должно работать с уверенностью. Ну, это сработало для меня хорошо. – Lucky