簡體   English   中英

Spring Rabbit和JDBC事務問題

[英]Spring rabbit and JDBC transaction issue

我有兩個春季兔子消費者A和B。

消費者A:

protected void process(Message amqpMessage, Channel channel)
            throws Exception {
   Session mysession=sessionRepository.findOne(5);
   mysession.setMyField("bla");
   sessionRepository.save(mysession);
   ServicesHelper.convertAndSend(<Consumer B token>, mysession.getId());

}

消費者B:

protected void process(Message amqpMessage, Channel channel)
            throws Exception {
   //getting event from message
   Long sessionId=5;
   Session mysession=sessionRepository.findOne(sessionId);
   mysession.setMyField("bla-bla");
   //And I get there unpredictable optimistic locking exception. 
   sessionRepository.save(mysession);


}

似乎在消費者A中的jdbc事務在從偵聽器方法退出后正在提交,這就是為什么可以重疊的原因。 我的“會話”條目具有@Version列,這就是為什么我發現此問題的原因。 如何避免這種情況,這是否是一個好方法? 我只需要在消費者A中處理一個會話,然后傳遞給消費者B。

我認為您可能在這里談論的是spring-data而不是spring-jdbc 如果是這種情況(如果不是,則表示歉意),並且您正在使用CrudRepository則可能是因為與存儲庫的交互都是@Transactional

例如,這是保存的實際簽名

@Transactional
    public <S extends T> S save(S entity) {

        if (entityInformation.isNew(entity)) {
            em.persist(entity);
            return entity;
        } else {
            return em.merge(entity);
        }
    }

我建議將其重構為以下內容,然后重試:-

protected void process(Message amqpMessage, Channel channel)
            throws Exception {

   ServicesHelper.convertAndSend(<Consumer B token>,adaptSession().getId()));

}

@Transactional
protected Session adaptSession(){
   Session mysession=sessionRepository.findOne(5);
   mysession.setMyField("bla");
   sessionRepository.save(mysession);
   return mysession; 
}

@Transactional
protected void process(Message amqpMessage, Channel channel)
            throws Exception {
   //getting event from message
   Long sessionId=5;
   Session mysession=sessionRepository.findOne(sessionId);
   mysession.setMyField("bla-bla");
   //And I get there unpredictable optimistic locking exception. 
   sessionRepository.save(mysession);
}

哪個應該使交易單元匹配。 試試看,我知道。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM