2012-06-27 5 views
0

У меня есть два приложения Первое приложение будет храниться в базе данных в цикле while, цикл завершится через долгое время (скажем, 10-15 минут). Но второе приложение нуждается в данных, которые первое приложение уже сохраняло в базе данных, Второе приложение не может дождаться завершения первого приложения. Он начнется сразу после запуска первого приложения. Я использовал EntityManager.flush() в первом приложении, надеясь, что первое приложение немедленно синхронизирует данные с базой данных. Так что второе приложение, которое находится в другой транзакции, может начать работу с данными.Скрывает ли Hibernate после совершения всей транзакции?

Это не работает, какова цель метода flush(), чем и как я могу решить свою проблему? Пожалуйста помоги !!

ответ

5

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

Но только потому, что вы покраснели, не означает, что другие транзакции увидят изменения. Это зависит от уровня изоляции транзакций, который в большинстве баз данных READ_COMMITTED. Транзакции выполняются изолированно друг от друга (I в ACID). Итак, если ваш уровень изоляции READ_COMMITTED, транзакция во втором приложении не увидит никаких изменений, сделанных в транзакции первого приложения, пока эта транзакция не будет выполнена.

+0

У меня установлен tx_isolation значение REPEATABLE-READ, какой уровень изоляции наиболее уместен из приведенного выше сценария. – web2dev

+0

И снова я не хочу блокировать другие транзакции от чтения и обновления данных, что я хочу, это последнее значение. – web2dev

+0

Затем вы разделите между несколькими транзакциями, как предлагает Стефан, или измените уровень изоляции ваших соединений с базой данных на READ_UNCOMMITTED. –

1

Звучит так, как будто вы должны разделить работу первого приложения на отдельные транзакции. Изменения обычно видны только для других транзакций после фиксации (как объяснил JB Nizet. Вы можете это изменить, но не должны).

+0

Я не могу разделить свои транзакции, так как мне может понадобиться откат транзакции с самого начала, если что-то не так. – web2dev

+0

Как это должно работать? Когда вы откатываете первую транзакцию, но второй alread читает данные и обрабатывает их? –

+0

Умммм ... я об этом не думал. Тогда у меня нет другого решения, а затем его расщепления. Большое спасибо . – web2dev