我正在尝试将SDN(4.2.0.M1
)和neo4j-ogm(2.0.5
)的版本升级到最新的快照4.2.0.BUILD-SNAPSHOT
和2.1.0-SNAPSHOT
。
按照迁移指南和其他SO问题的一些建议,我包装了所有与@Transactional
与neo4j会话交互的方法。在大多数情况下,它都可以正常工作,但是仍然有些我无法理解的异常(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
方法来注释,因为这是唯一与SDN直接交互的方法,至少这是我的想法:)但是,如果我调用
addContact
方法,该方法只是对列表进行迭代并调用带注释的addContacts
方法,则它将失败,并带有前面提到的异常。如果我也注释该方法,则它很好用,但是我不明白为什么。也许我缺少有关spring addContact
注释行为的一些基础知识,如果这是一个毫无头脑的问题,请您谅解。谁能澄清为什么我需要同时注释这两种方法?
提前致谢
最佳答案
@Transactional
比大多数人想象的要复杂。看起来应该工作的实际上是无效的,有时反之亦然。
对于您而言,您遇到了一个不友好的Spring问题:从同一类中调用事务方法时,不了解@Transactional
AOP代理的工作方式。
This snippet from the official documenation是一个大致了解Spring事务代理基础知识的好起点。
快速搜索StackOverflow带给我this answer,它可以很好地解释您所看到的现象。
注意:从4.2版开始,SDN现在完全实现了Spring Transaction Platform。
关于java - SDN迁移到4.2:@Transactional如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40851415/