我们在项目中使用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();
}
}
如果更新或其他服务的调用失败,插入会发生什么?是否会有回滚并且插入永远不会被执行?或者插入是否仍然存在于DB中?我是否需要在每个方法中声明以下命令才能执行回滚。
@Transactional(rollbackFor= Exception.class)
如果是这种情况,如果我的服务调用抛出异常会发生什么?它还能运作吗?谢谢您的帮助。我真的很想了解在服务调用中执行回滚的方式。
答案 0 :(得分:2)
默认情况下,如果检查了异常(扩展Exception),则回滚不会发生 - 事务将被提交。否则(如果更改了默认值或我们正在讨论未经检查的异常),则回滚事务并且INSERT / UPDATE语句不会持久存在。顺便说一句,这在JavaDocs中描述为rollbackFor属性;)
如果最终从您的Transactional方法抛出异常,那么该异常的起源并不重要。
如果您不确定该行为,可以随时调试Spring HibernateTransactionManager
及其超类。