Как работает default @Transactional на низком уровне? - PullRequest
0 голосов
/ 22 ноября 2018

Собирает ли заданное по умолчанию распространение @Transactional все запросы и выполняет их в конце метода в целом, или он открывает транзакцию db и выполняет BEGIN, каждый запрос, как он его находит, и когда транзакция завершается, выполняет COMMIT?

Это то, что называется логическими или физическими транзакциями?

Мне интересно, что, поскольку я использую тесты @Transactional, которые выполняют конечную точку GET + конечную точку DELETE + конечную точку GET с READ_UNCOMMITED, поведение управляетчтобы работать хорошо, но я не вижу следов запросов на удаление в журналах, только выбирает.

Я бы ожидал, что я вижу все выполненные запросы и затем откат, но у меня такое ощущение, что транзакция простоизменяя управляемые объекты контекста персистентности и просто пытаясь сохранить к концу теста ...

Если я должен видеть все запросы на удаление, поскольку repository.removes () выполняется, то это может бытьчто по какой-то причине hibernate только регистрирует запросы из транзакции readonly = false

1 Ответ

0 голосов
/ 22 ноября 2018

Может быть, этот ответ поможет вам: JPA-сброс или фиксация

Если есть активная транзакция, JPA / Hibernate выполнит метод очистки при фиксации транзакции.Между тем, все изменения, примененные к сущностям, собираются в Единица работы .

В flush () изменения данных отражаются в базе данных после возникновения сброса, но этовсе еще вaction.flush () ДОЛЖЕН быть заключен в контекст транзакции, и вам не нужно делать это явно, если в этом нет необходимости (в редких случаях), когда EntityTransaction.commit () делает это за вас.

Вы можете изменить это поведение, изменив стратегию сброса.

...