我正在尝试将SDN版本(4.2.0.M1
)和neo4j-ogm(2.0.5
)升级到最新快照4.2.0.BUILD-SNAPSHOT
和2.1.0-SNAPSHOT
。
根据迁移指南和其他SO问题的一些建议,我将所有与neo4j 会话交互的方法与@Transactional
包装在一起。它在大多数情况下都能正常工作,但仍有一些我无法理解的异常(Transaction is not current for this thread
)。
让我举个例子:
@Service
public class ContactServiceImpl implements ContactService {
@Inject
private Session session;
//...
@Override
@Transactional
public void addContact(String userId, String contactId) {
Contact contact = new Contact();
// Fill contact data
session.save(contact);
}
@Override
public void addContacts(String userId, Set<User> newContacts) {
for (User contact : CollectionUtils.emptyIfNull(newContacts)) {
addContact(userId, contact.getId());
}
}
}
这里我只使用@Transaction
addContact
方法进行了注释,因为它是唯一一个与SDN直接交互的方法,至少这是我的想法:)
但是,如果我调用addContacts
方法,它只是迭代一个列表并调用带注释的addContact
方法,它就会失败并出现前面提到的异常。如果我也注释这个方法,它只是运作良好,但我不明白为什么。也许我错过了关于spring @Transactional
注释行为的一些基础知识,如果这是一个没脑子的问题,那就很抱歉。
任何人都可以澄清为什么我需要注释这两种方法吗? 提前致谢
答案 0 :(得分:1)
@Transactional
比大多数人想象的要复杂一些。看起来它应该起作用的实际上并没有,反之亦然。
在你的情况下,你遇到了一个不友好的Spring问题:在同一个类中调用事务方法时,不了解@Transactional
AOP代理是如何工作的。
This snippet from the official documenation是一个很好的起点,可以大致了解Spring的事务代理的基础知识。
快速搜索StackOverflow给我this answer带来了很好的解释你所看到的现象。
注意: 从版本4.2开始,SDN现在完全实现了Spring Transaction Platform。