2012-06-10 3 views
0

В моем приложении у меня есть процесс, который занимает некоторое время (30 секунд - 5 минут) и в течение этого времени манипулирует базой данных через JPA.Изменение поля объекта за одну транзакцию

Моя проблема заключается в том, что я хочу, чтобы установить состояние процесса его дб объекта:

void runProcess(Process process) { 
    process.setState("Started."); 
    em.merge(process); 

    ... db manipulations 

    process.setState("First phase finished."); 
    em.merge(process); 

    ... db manipulations 

    process.setState("Process finished."); 
    em.merge(process); 
} 

Проблема заключается в том, что только первое обновление происходит и другие остаются игнорируются.

я не получаю никаких ошибок и Hibernate журналов я могу видеть процесс обновления три раза:

Hibernate: update process set state=? where id=? 

Но только первое обновление будет иметь место.

Спасибо.

ответ

1

Изменения, внесенные в объекты, производятся в памяти и записываются только в базу данных во время промывки (как правило, в конце транзакции).

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

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

+0

Это то, о чем я думал. Но как я могу добиться его запуска в разных транзакциях? Я не могу предотвратить повторное использование текущей транзакции. Благодаря! –

+0

Что вы используете для обработки транзакций? EJBs? Весна? Обычный API JPA? –

+0

Весна и @Transactional (readOnly = false) аннотация. –

Смежные вопросы