@Transactional не совершает (Spring Mybatis) - PullRequest
0 голосов
/ 02 июля 2018

у меня ниже Служба:

@Transactional(propagation = Propagation.REQUIRES_NEW,isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class)
public void test(String idEntity) throws BaseException
{
    getCustomerInformationDAO().updatetm(idEntity);
}

Эта служба помечена как аннотация @Service.

Я звоню на эту услугу с контроллера.

    @RequestMapping(value="/test", method = RequestMethod.GET,produces = MediaType.APPLICATION_JSON_VALUE,consumes = MediaType.APPLICATION_JSON_VALUE)
@Override
public void test(@RequestParam("idEntity") String idEntity) throws BaseException
{
    monolithicService.test(idEntity);
}

Ниже Dao (это было помечено как @Repository) метод:

@Override
    public void updatetm(String idEntity) throws BaseException
    {
    updateRecord( "customerinformation-update.updatelfcentitylDt", idEntity ); 
    }

Менеджер транзакций был отмечен как

<tx:annotation-driven transaction-manager="transactionManager" />.

С указанными выше изменениями транзакция не фиксируется, даже если она прошла успешно.

Может ли кто-нибудь помочь мне с этим ...

1 Ответ

0 голосов
/ 24 сентября 2018

Я сталкивался с подобной проблемой целый день.

Как раз когда я был на грани сумасшествия, я обнаружил, что когда вы используете @Transactional в тесте, правила отличаются: по умолчанию ваши изменения отменяются.

Быстрое решение: добавьте аннотацию @Commit к вашему методу, т. Е .:

@Transactional(propagation = Propagation.REQUIRES_NEW,isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class)
@Commit
public void test(String idEntity) throws BaseException
{
    getCustomerInformationDAO().updatetm(idEntity);
}

Некоторые подробности можно прочитать в следующем тексте:

Одной из распространенных проблем в тестах, которые обращаются к реальной базе данных, является их влияние на состояние постоянного хранилища. Даже когда вы используете базу данных разработки, изменения в состоянии могут повлиять на будущие тесты. Кроме того, многие операции, такие как вставка или изменение постоянных данных, не могут быть выполнены (или проверены) вне транзакции.

Платформа TestContext решает эту проблему. По умолчанию платформа создает и откатывает транзакцию для каждого теста. Вы можете написать код, который может предполагать существование транзакции. Если вы вызываете транзакционно проксируемые объекты в своих тестах, они ведут себя правильно, в соответствии с их настроенной транзакционной семантикой. Кроме того, если метод теста удаляет содержимое выбранных таблиц во время работы в транзакции, управляемой для теста, транзакция по умолчанию откатывается, и база данных возвращается в свое состояние до выполнения теста. Транзакционная поддержка предоставляется тесту с использованием bean-компонента PlatformTransactionManager, определенного в контексте приложения теста.

Если вы хотите зафиксировать транзакцию (необычно, но иногда полезно, когда вы хотите, чтобы конкретный тест заполнял или изменял базу данных), вы можете указать платформе TestContext, что транзакция будет зафиксирована, а не откатана, с помощью @ Зафиксировать аннотацию.

https://docs.spring.io/spring/docs/current/spring-framework-reference/testing.html#testing

...