gpt4 book ai didi

java - SDN 迁移到 4.2 : How does @Transactional works?

转载 作者:行者123 更新时间:2023-11-30 07:01:31 25 4
gpt4 key购买 nike

我正在尝试将 SDN (4.2.0.M1) 和 neo4j-ogm (2.0.5) 版本升级到最新快照 4.2 .0.BUILD-SNAPSHOT2.1.0-SNAPSHOT

按照迁移指南和其他 SO 问题的一些建议,我用 @Transactional 包装了与 neo4j session 交互的所有方法。它在大多数情况下都能正常工作,但仍然存在一些我无法理解的异常(exception)情况(该线程的事务不是当前的)。

举个例子:

@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 注释行为的基础知识,如果这是一个无脑的问题,很抱歉。

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

最佳答案

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

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

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

快速搜索 StackOverflow 后,我找到了 this answer这很好地解释了您所看到的现象。

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

关于java - SDN 迁移到 4.2 : How does @Transactional works?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40851415/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com