Spring事务(六):事务的隔离级别与传播方式的处理04
2023-12-16 13:07:22
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_DEFAULT
和PROPAGATION_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_DEFAULT
和PROPAGATION_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事务有所帮助。