返回

Spring事务(六):事务的隔离级别与传播方式的处理04

后端

Spring事务(六):事务的隔离级别与传播方式的处理04

前言

本文是《事务的隔离级别与传播方式的处理》分析的第四篇,接上文,我们继续。

3.6 执行具体的业务

    @Test
    public void testMultiTransactional() {
        // 开始执行业务方法
        doBusiness();
    }

    // 执行业务逻辑方法
    private void doBusiness() {
        // 首先根据用户id查询用户信息
        User user = userService.find(id);
        // 根据用户id删除用户信息
        userService.delete(id);
        // 然后再插入用户信息
        userService.insert(user);
        // ......
    }

这段代码最终会调用到业务方法UserService#insert,本文并不会探究这其中是怎么执行的,我们只需要知道最终会执行这个方法就可以了。

3.7 Spring事务运行的执行过程(回滚)

经过前面几节的铺垫,现在我们一起来看一看Spring事务运行的执行过程。

  • 调用UserService#insert方法。
  • Spring在UserService#insert方法执行之前,会先判断这个方法是否带有事务注解(不管是什么事务注解)。
  • 如果带了事务注解,那么就会创建一个事务。
  • UserService#insert方法执行完成后,Spring就会根据事务注解中的配置来提交或回滚事务。

3.7.1 回滚事务

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

<bean id="userService" class="cn.itcast.spring.hibernate.test.service.UserService">
    <property name="sessionFactory" ref="sessionFactory" />
    <property name="transactionManager" ref="transactionManager" />
</bean>

在这个配置中,事务的隔离级别和传播方式分别被设置为ISOLATION_DEFAULTPROPAGATION_REQUIRED。这意味着,当UserService#insert方法执行时,Spring会创建一个新的事务,并且这个事务的隔离级别是默认的隔离级别,传播方式是必须有事务。

UserService#insert方法执行完成后,Spring就会根据事务注解中的配置来提交或回滚事务。在这个例子中,UserService#insert方法没有抛出任何异常,所以Spring就会提交事务。

但是,如果UserService#insert方法抛出了异常,那么Spring就会回滚事务。

    @Test
    public void testMultiTransactionalException() {
        // 开始执行业务方法
        try {
            doBusinessException();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 执行业务逻辑方法
    private void doBusinessException() {
        // 首先根据用户id查询用户信息
        User user = userService.find(id);
        // 根据用户id删除用户信息
        userService.delete(id);
        // 然后再插入用户信息
        userService.insert(user);
        // 模拟异常
        throw new RuntimeException("模拟异常");
        // ......
    }

在这个例子中,UserService#insert方法抛出了一个异常,所以Spring就会回滚事务。

3.7.2 提交事务

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

<bean id="userService" class="cn.itcast.spring.hibernate.test.service.UserService">
    <property name="sessionFactory" ref="sessionFactory" />
    <property name="transactionManager" ref="transactionManager" />
</bean>

在这个配置中,事务的隔离级别和传播方式分别被设置为ISOLATION_DEFAULTPROPAGATION_REQUIRED。这意味着,当UserService#insert方法执行时,Spring会创建一个新的事务,并且这个事务的隔离级别是默认的隔离级别,传播方式是必须有事务。

UserService#insert方法执行完成后,Spring就会根据事务注解中的配置来提交或回滚事务。在这个例子中,UserService#insert方法没有抛出任何异常,所以Spring就会提交事务。

    @Test
    public void testMultiTransactionalNoException() {
        // 开始执行业务方法
        doBusinessNoException();
    }

    // 执行业务逻辑方法
    private void doBusinessNoException() {
        // 首先根据用户id查询用户信息
        User user = userService.find(id);
        // 根据用户id删除用户信息
        userService.delete(id);
        // 然后再插入用户信息
        userService.insert(user);
        // ......
    }

在这个例子中,UserService#insert方法没有抛出任何异常,所以Spring就会提交事务。

结语

本文详细地分析了Spring事务的运行过程,包括事务的创建、提交和回滚。希望本文能够对您理解Spring事务有所帮助。