SDN迁移到4.2:@Transactional如何运作?

时间:2016-11-28 18:51:44

标签: java spring transactional spring-data-neo4j-4 neo4j-ogm

我正在尝试将SDN版本(4.2.0.M1)和neo4j-ogm(2.0.5)升级到最新快照4.2.0.BUILD-SNAPSHOT2.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注释行为的一些基础知识,如果这是一个没脑子的问题,那就很抱歉。

任何人都可以澄清为什么我需要注释这两种方法吗? 提前致谢

1 个答案:

答案 0 :(得分:1)

@Transactional比大多数人想象的要复杂一些。看起来它应该起作用的实际上并没有,反之亦然。

在你的情况下,你遇到了一个不友好的Spring问题:在同一个类中调用事务方法时,不了解@Transactional AOP代理是如何工作的。

This snippet from the official documenation是一个很好的起点,可以大致了解Spring的事务代理的基础知识。

快速搜索StackOverflow给我this answer带来了很好的解释你所看到的现象。

注意: 从版本4.2开始,SDN现在完全实现了Spring Transaction Platform。