[英]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.