春天@Transactional。它是如何运作的?

时间:2018-03-15 19:19:23

标签: java hibernate spring-mvc

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

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

1 个答案:

答案 0 :(得分:2)

默认情况下,如果检查了异常(扩展Exception),则回滚不会发生 - 事务将被提交。否则(如果更改了默认值或我们正在讨论未经检查的异常),则回滚事务并且INSERT / UPDATE语句不会持久存在。顺便说一句,这在JavaDocs中描述为rollbackFor属性;)

如果最终从您的Transactional方法抛出异常,那么该异常的起源并不重要。

如果您不确定该行为,可以随时调试Spring HibernateTransactionManager及其超类。