Обновления из метода 'save' интерфейса 'CrudRepository' не видны в другом потоке - PullRequest
0 голосов
/ 10 марта 2020

Просто общее описание того, чего я пытаюсь достичь:

У меня есть метод, аннотированный @Transactional, в котором я получаю Entity по id, проверьте, является ли поле (поле даты в данном случае) ноль или нет. Если это значение равно null, выполните некоторую обработку и установите в поле значение, отличное от NULL.

Ниже указана моя сущность:

@Entity
@Table(name = "Form")
public class Form {
  @Id
  @GeneratedValue
  private long id;
  private String type; 

  //Few more fields

  @Temporal(TIMESTAMP)
  protected Date finishedAt;


  //getters and setters
}

Ниже приведен мой класс репозитория:

@Repository
public interface FormRepository extends CrudRepository<Form, Long> {
  Form findById(Long id);
  //Other business methods
}

Ниже приведен класс обслуживания с реализацией метода обслуживания:

//imports

@Service
public class FormService{

//Autowired Dependencies declarations

//EntityManager em;

@Transactional(rollbackFor = Exception.class, isolation = READ_COMMITTED)
public void process(String formId){
     Form form = formRepository.findById(formId).get();

     em.lock(form, LockModeType.PESSIMISTIC_WRITE); //Declared EntityManger em in class definition
     em.refresh(form);

     if(form.getFinishedAt() == null){
       //Do some business logic

       form.setFinishedAt(new Date);
       formRepository.save(form);

     }


}

}

Формы находятся в очереди, и служба заданий опрашивает очередь, затем выбирает незавершенные формы и процессы (т. Е. Вызывает метод 'process'). , Проблема, с которой я сталкиваюсь, заключается в том, что, когда THREAD1 начинает обрабатывать экземпляр «Form» с «ID», скажем, 100. Он завершает его обработку и устанавливает поле «done» в момент времени, скажем, T1.

Когда другой поток THREAD2 пытается обработать ту же форму в момент времени T1 + 30 (секунд), он должен увидеть ее завершенной и ничего не делать. Вместо этого он видит его как незавершенный (getFinishedAt () как ноль) и снова делает бизнес-логи c для того же идентификатора формы.

Не уверен, почему это может произойти, поскольку я создал явную транзакцию и вызвал метод 'save' после того, как установлено поле Finish. THREAD2 по-прежнему не видит обновленное значение «Finished». Любая помощь или вклад приветствуются, заранее спасибо.

...