2016-01-15 3 views
0

После создания нового объекта «Заказ» я хотел бы получить его сгенерированный идентификатор и поместить его в очередь AMQP, чтобы рабочий мог делать с ним другие вещи. Рабочий принимает сгенерированный идентификатор (сообщение) и ищет порядок, но жалуется, что никакой записи не существует, хотя я только что создал ее. Я пытаюсь выяснить, как долго ждать, когда я вызову свой .perist(), прежде чем я поставлю сообщение (сгенерированный идентификатор) в очередь (что я не считаю хорошей идеей); иметь рабочий цикл снова и снова до тех пор, пока mysql не вернет запись (которой мне тоже не нравится); или найти точку, где я могу поместить сообщение в очередь после того, как я знаю, что данные безопасны в mysql (это звучит лучше всего). Я думаю, что это нужно сделать за пределами любого метода @Transactional.В какой момент можно доверять, что данные были сохранены в mysql?

Работник, который будет считывать данные из mysql, является частью другой системы на другом сервере. Итак, когда я могу сказать работнику, что данные находятся в mysql, чтобы он мог начать свою задачу?

Верно ли, что после завершения метода @Transactional данные записываются в mysql, у меня возникли проблемы с пониманием этого. Спасибо, миллион в продвинутом состоянии.

+0

Операции с базой данных - довольно широкий предмет, но да, вы должны убедиться, что транзакция, которая записывает данные, закончилась, прежде чем вы попытаетесь прочитать ее из другой транзакции. Если, конечно, ваша изоляция транзакций не является «READ_UNCOMMITTED», но давайте не будем этого делать. – Kayaman

+0

После того, как вы совершили транзакцию, все ваши действия будут сохранены и видны другим процессам, выполняющим свои транзакции. Если вы не используете READ_UNCOMMITTED в качестве уровня изоляции транзакции. – Ralf

+0

мой вопрос больше связан с тем, что рабочий, который выбирает идентификатор заказа из очереди, является частью другой системы - извините, что забыл упомянуть в своем вопросе. плохо обновите это. – Dagron

ответ

0

Верно ли, что после того, как @Transactional метод завершает данные сделано записываются в MySQL, у меня возникли проблемы с пониманием этого. Спасибо, миллион в продвинутом состоянии.

Так первый, так как Kayamann и Ральф написал в комментариях, это гарантирует, что данные хранятся и доступны для других процессов при транзакции (концы)

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

Так что, если у нас есть

@Transactional 
public void modify(){ 
    doSomething(); 
} 

И когда вы звоните где-то в коде (или invokation через contaier например, из-за некоторых привязок) actuall Фрол будет следующим

tx=entityManager.beginTransaction(); 
object.modify(); 
tx.commit(); 

Eсть довольно просто. Такой подход будет означать, что транзакции заключаются в том, что транзакции - это Container Controlled

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

Удаленные системы могут сигнализировать каждый элемент для различных событий через очереди и службы REST, поэтому нет никакой разницы.