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

标签 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();
    }

}

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

@Transactional(rollbackFor= Exception.class)

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

最佳答案

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

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

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

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

相关文章:

java.lang.UnsupportedClassVersionError 异常

java - 错误 Hibernate 属性 "Lazy"

java - Spring REST Hibernate 应用设计

java - OSGi 上的 PostgreSQL 连接器

spring-mvc - spring 3.0 中如何绑定(bind)请求参数?

java - 使用专有 header 反编译已编译的 Java 文件

java - 使用 hbm.xml 的 Hibernate 中主键的强制 setter

spring - 无法加载 ApplicationContext(带注释)

java - 继承 : Evaluating In Derived Class's Scope?

java - 使用 CrudRepository 接口(interface)自动实现返回不同类型对象的方法