Я работаю над кодом, который вызывает, транзакция после транзакции.
@Asynchronous
@TransactionTimeout(value = 12, unit = TimeUnit.HOURS)
public void runExport(Long id) {
/*
* some stuff that takes time
*/
em.persist(objectTest);
manager.runAnotherTransaction(id);
}
@Asynchronous
@TransactionTimeout(value = 1, unit = TimeUnit.HOURS)
public void runCopy(Long id) {
if(manager.isPreviousValueCommited(id)){
//do some stuff
}
/*
* some stuff that takes time
*/
}
//other class
public void runAnotherTransaction(long id){
//...
superBean.runCopy(id);
}
public void isPreviousValueCommited(long id){
//Thread.sleep(1000) if we sleep here, object wont be null
SomeObject obj = em.find(SomeObject.class, id); //is null,
}
Как вы можете видеть в коде, первый метод транзакции является постоянным объектом, и после этого мы вызываем другой метод через некоторый вроде manager
, а вторая транзакция хочет проверить некоторые вещи на ранее зафиксированном объекте. Но, как вы, вероятно, подозреваете, он не может, потому что объект не существует в базе данных (первая транзакция не смогла сохранить его, прежде чем мы спросим db). Когда я засыпаю перед тем, как найти этот объект, все в порядке.
Этот пример кода довольно прост, и, вероятно, имеет смысл не передавать id, а сам объект (true?), Чтобы избежать этой проблемы, но У меня вопрос. Но я хотел бы выслушать другие идеи или плюсы / минусы (возможно, есть гораздо больше минусов) этого подхода к подключению транзакции, как у меня в примере.