我正在尝试将SDN(4.2.0.M1)和neo4j-ogm(2.0.5)的版本升级到最新的快照4.2.0.BUILD-SNAPSHOT2.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/

10-12 01:17