Мне нужно заставить потребителя использовать список объектов MyStuff, но я должен иметь возможность заблокировать его на уровне БД, чтобы данные не были повреждены несколькими серверами.
@Service
@EnableTransactionManagement
public class Worker{
@Autowired
private SessionFactory sessionFactory;
private Session getSession(){
return sessionFactory.openSession();
}
private MyObject getMyObject(Session session, Long id){
MyObject myObj = session.get(MyObject.class, id,LockMode.PESSIMISTIC_WRITE);
session.refresh(myObj);
return myObj;
}
@Transactional
private Consumer<List<MyStuff>> getNewConsumer(){
return new Consumer(){
private void accept(List<MyStuff> myStuff){
Session session = getSession();
Long id = myStuff.getID();
MyObject myObject = getMyObject(session, id);
//process MyStuff
session.save(myObject);
session.flush();
session.close();
}
}
}
}
Я получаю сообщение об исключении:
javax.persistence.TransactionRequiredException: транзакция не выполняется> в org.hibernate.internal.SessionImpl.checkTransactionNeeded (SessionImpl.java:3461) в org.hibernate.internal.SessionImpl.doFlush (SessionImpl.java:1425) в org.hibernate.internal.SessionImpl.flush (SessionImpl.java:1421) в com.me.Worker $ 1.save (Worker.java)
Как это исправить?