我们在项目中使用 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/