gpt4 book ai didi

java - Spring @Transactional。它到底如何运作?

转载 作者:行者123 更新时间:2023-12-02 02:15:52 29 4
gpt4 key购买 nike

我们在项目中使用 Spring 和 Hibernate。我们正在使用 Spring 事务注释,我们了解它的作用,但我们仍然对回滚有一些疑问。

假设我们有以下代码。

@Transactional
@Service
public class PersonServiceImpl implements PersonService {

@Autowired
private PersonDao personDao;

@Autowired
private AnotherService anotherService;

@Override
public void doSomething() throws Exception {
Person person = new Person();
person.setName("John");
personDao.insert(person);
person.setName("Megan");

//What happens if the following call fails and throws and exception.
personDao.update(person);

// What happens if this other service's call fails?
anotherService.doSomethingElse();
}

}

如果更新或其他服务的调用失败,插入会发生什么?是否会出现回滚并且插入永远不会被执行?或者插入仍会保留在数据库中吗?我是否需要在每个方法中声明以下命令才能执行回滚。

@Transactional(rollbackFor= Exception.class)

如果是这种情况,如果我的服务调用抛出异常会发生什么?它还有效吗?谢谢您的帮助。我真的很想了解在服务调用中执行回滚的方式。

最佳答案

默认情况下,如果检查了异常(扩展异常),则不会发生回滚 - 将提交事务。否则(如果默认值被更改或者我们正在讨论未经检查的异常),事务将回滚并且 INSERT/UPDATE 语句不会保留任何内容。顺便说一句,JavaDocs 中对 rollbackFor 属性对此进行了描述;)

如果异常最终是从事务方法中抛出的,那么该异常源自何处并不重要。

如果您不确定其行为,您可以随时调试 Spring 的 HibernateTransactionManager 及其父类(super class)。

关于java - Spring @Transactional。它到底如何运作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49307637/

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