TransactionRequiredException: ни одна транзакция не выполняется для текущего потока внутри Consumer - PullRequest
0 голосов
/ 07 декабря 2018

Мне нужно заставить потребителя использовать список объектов 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)

Как это исправить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...