У нас есть конечная точка HTTP, выполнение которой занимает много времени и которая также может вызываться пользователями одновременно.В рамках этого запроса мы обновляем модель внутри синхронизированного блока, чтобы другие (возможно, параллельные) запросы воспринимали это изменение.
Например,
MyModel m = null;
synchronized (lockObject) {
m = MyModel.findById(id);
if (m.status == PENDING) {
m.status = ACTIVE;
} else {
//render a response back to user that the operation is not allowed
}
m.save(); //Is not expected to be called unless we set m.status = ACTIVE
}
//Long running operation continues here. It can involve further changes to instance "m"
Причина, по которой блок синхронизирован , заключается в том, что даже одновременные запросы могут получить последний статус.Однако базовый JPA не фиксирует мои изменения (m.save ()) до тех пор, пока запрос не будет завершен.Поскольку это длительный запрос, я не хочу ждать, пока запрос будет завершен, и все же хочу убедиться, что другие абоненты будут уведомлены об изменении статуса.Я пытался вызвать "m.em (). Flush (); JPA.em (). GetTransaction (). Commit ();"после m.save (), но это делает транзакцию недоступной для последующего действия как части того же запроса.Могу ли я просто дать "JPA.em (). GetTransaction (). Begin ();"и позволить Play обрабатывать транзакции с тех пор?Если нет, то как лучше всего справиться с этим вариантом использования?
ОБНОВЛЕНИЕ: На основании ответа я изменил свой код следующим образом:
MyModel m = null;
synchronized (lockObject) {
m = MyModel.findById(id);
if (m.status == PENDING) {
m.status = ACTIVE;
} else {
//render a response back to user that the operation is not allowed
}
m.save(); //Is not expected to be called unless we set m.status = ACTIVE
}
new MyModelUpdateJob(m.id).now();
И в моей работе у меня есть следующая строка:
doJob() {
MyModel m = MyModel.findById(id);
print m.status; //This still prints the old status as-if m.save() had no effect...
}
Что мне не хватает?