Без JPA @Transaction и save () когда выполняется коммит? - PullRequest
1 голос
/ 26 апреля 2020

Когда метод имеет аннотацию @Transaction, я знаю, что фиксация выполняется в конце метода. Но когда я не использую @Transaction, мне неясно, когда завершится коммит. В моем примере я не использую @Transaction, делаю реальные изменения в другом сервисе и не использую someRepository .save (), но он все еще работает:

    @Service
    public class ServiceA {

        private final SomeRepository someRepository;
        private final ServiceB serviceB;

        public ServiceA(SomeRepository someRepository, ) {
            this.someRepository = someRepository;
            this.serviceB = serviceB;
        }

        // Called from controller
        public void doStuff() {

            var someEntity = someRepository.findById(1);
            serviceB.makeChange(someEntity);

        }

    }

    @Service
    public class ServiceB {

        public ServiceB() {}

        public void makeChange(SomeEntity someEntity) {

            someEntity.setName("Test"); // this is working and committed to the database

        }

    }

Так что на самом деле у меня есть 2 вопроса:

  1. Когда я не добавляю аннотацию @Transaction в метод, когда выполняется фиксация?
  2. Мне даже не нужно вызывать someRepository.save (entity)? Я думал, что это работает только при использовании аннотации @Transaction?

Контекст:

  • Spring Boot 2.2.6
  • "spring-boot-starter- data-jpa "как зависимость

1 Ответ

0 голосов
/ 26 апреля 2020

первое уточнение: аннотация @Transactional не означает, что в конце метода есть коммит. Это означает, что метод присоединяет транзакцию (или запускает новую - это зависит от точных атрибутов распространения), поэтому фиксация (или откат) будет выполняться в конце транзакции, что может (и часто делает) несколько методов с различным доступом к БД.
Обычно Spring (или другой менеджер транзакций) позаботится об этом (ie отключение автоматической фиксации).

@ Транзакционная пропущена
Транзакционный контекст отсутствует, поэтому фиксация выполняется немедленно, так как база данных изменена. Опция отката отсутствует, и в случае ошибки целостность данных может быть нарушена,

@ Определено транзакцией
Во время транзакций объекты JPA находятся в управляемом состоянии, в конце транзакции состояние автоматически сбрасывается в БД (не нужно вызывать someRepository.save (entity)

...