Данные не обновляются в oracle -db в текущей функции - PullRequest
0 голосов
/ 06 мая 2020

Из метода callAndUpdateInB (). Предположим, я вызываю метод update () класса B (@Component), в котором я вызываю метод myRepository.save () для обновления некоторых данных в db, и в той же функции я я выполняю некоторые другие вызовы ... а затем возвращаю ответ обратно в класс A.

Итак, проблема в том, что данные обновляются в базе данных, когда метод update () класса B возвращает ответ обратно методу класса A callAndUpdateInB ( ). Но он должен был обновить его, когда я вызвал myRepository.save () в методе обновления класса B ().

Почему так?

Для справки просто посмотрите этот фиктивный пример

class A{

    @Autowired
    B b;

    public void callAndUpdateInB(String arg){

        String data = b.update(arg);

        //    check Updates in Db (True)
        //    Now data is updated in db
    }
}  

@Component
class B{

    @Transactional(
    propagation = Propagation.REQUIRED
    )
    public String update(String arg){
        MyRepository myRepository; //  This is abstract class having 
                                   //  imlementation for the following 
                                   //  data. (MyRepositoryImpl)
        String updatedData = myRepository.save(arg);

        //    check Updates in Db (False)
        //    Making some other calls, which need that updated data
        //    But data is not still updated in db.
        //    Though here the updated data field is showing that the data is updated, but it 
        //    is not actually updated in the db.

        return updatedData;
    }
}  

Ответы [ 2 ]

2 голосов
/ 06 мая 2020

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

Следовательно, вы не можете увидеть данные до того, как метод вернется.

Дополнительно при сохранении не выполняется вставка / обновить заявление. Это также произойдет до фиксации транзакции.

Если вы хотите выполнить операторы до того, как вам нужно будет вызвать saveAndFlu sh (). НО также не будет фиксировать транзакцию, и из другой транзакции вы также не увидите эти данные.

Это обычное и ожидаемое поведение транзакции в приложении Spring, использующем транзакции.

1 голос
/ 06 мая 2020

ТРЕБУЕТСЯ распространение

  • Поддержите текущую транзакцию, создайте новую, если ее нет. Аналогичен атрибуту транзакции EJB с тем же именем.

и сохраняет транзакцию незафиксированной и активной в конце аннотированного метода.

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

Разработчики обычно ожидают, что транзакция начнется и закончится вот так. Но в некоторых случаях изменение необходимо зафиксировать / откатить независимо от других изменений. Если это ваш случай, вы можете использовать Propagation.REQUIRES_NEW: см. { ссылка }

...