Spring Rabbit和JDBC事务问题

时间:2016-11-09 23:57:46

标签: java spring-data spring-amqp spring-rabbit

我有两只春兔消费者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事务在从侦听器方法退出后被提交,这就是为什么重叠是可能的。我的'session'entiry有一个@Version专栏,这就是我发现这个问题的原因。如何避免它,这是一个很好的方法吗?我只需要在消费者A中处理一个会话,然后传递给消费者B.

1 个答案:

答案 0 :(得分:1)

我想你可能在谈论spring-data而不是spring-jdbc。如果是这种情况(如果不是,则道歉)并且您正在使用CrudRepository,那么可能是因为与存储库的交互都是@Transactional

例如,这是save

的实际签名
@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);
}

哪个应该使交易单位匹配。试试看,我也知道。