Внешняя транзакция в случае использования вложенной транзакции не видит обновления в базе данных (JPA, MySQL, Spring Framework и Hibernate) - PullRequest
2 голосов
/ 04 января 2011

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

Вот фрагмент кода (ов) ..

@Transactional(readOnly = true)
public void doSomething() {
    // Some stuff happens here
    doMoreStuff();
    // Some more stuff happens here.
}

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void doMoreStuff() {
    ...
}

Метод "doMoreStuff" обновляет некоторые данные в базе данных, после чего метод "doSomething" должен видеть эти обновленные данные, но это не так. Например, doMoreStuff устанавливает логическое значение с false на true и сохраняет его. Метод doSomething все еще видит значение только как ложное.

Есть предложения?

Ответы [ 2 ]

2 голосов
/ 04 января 2011

Я не знаю, как происходит "вложение" транзакций в Hibernate (поскольку я не верю, что MySQL может фактически вкладывать транзакции).

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

Если это действительно так, то вы, вероятно, поражены уровнем изоляции MySQL по умолчанию, равным REPEATABLE READ, который не позволяет внешней транзакции видеть любые данные, которые были зафиксированы после * 1007.* эта транзакция началась.

Чтобы проверить эту теорию, попробуйте изменить уровень изоляции (внешней транзакции) на READ COMMITTED и посмотреть, решит ли это проблему.

1 голос
/ 04 января 2011

Вложенные транзакции - Пожалуйста, используйте - Propagation.PROPAGATION_NESTED

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