Вызов flush () в методе @Transactional в приложении Spring Boot - PullRequest
0 голосов
/ 18 января 2019

Возможно ли, что вызов Hibernate flush () в середине метода @Transactional сохранит неполные результаты в базе данных? Например, возможно ли, чтобы эта функция могла сохранить «Джона» в базе данных?

@Transactional
public void tt() {
    Student s = new Student("John");
    em.persist(s);
    em.flush();
    // Perform some calculations that change some attributes of the instance
    s.setName("Jeff");
}

Я попробовал это с базой данных H2 в памяти, и она не сохранила незавершенные изменения транзакции. Но возможно ли это при определенных условиях и, возможно, с другим движком БД?

1 Ответ

0 голосов
/ 18 января 2019

Он не должен ничего сохранять до того, как вы позвоните em.commit() или транзакция завершится. Лучшее объяснение, которое я нашел, это от здесь . Ниже основной выдержки:

Эта операция приведет к выполнению операторов DML (вставка / обновление / удаление и т. Д.) В базе данных, но текущая транзакция не будет зафиксирована. Это означает, что flush () не сделает текущие изменения видимыми для других экземпляров EntityManager или других внешних клиентов базы данных; это произойдет только при фиксации транзакции. Другими словами, операция flush () будет очищать только текущий кэш памяти из EntityManager в сеанс базы данных.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...