spring开启事务开启流程
时间: 2023-10-29 12:48:37 浏览: 40
当 Spring 容器启动时,通过 AOP 的方式,对定义了 @Transactional 注解的方法进行切面处理,创建 TransactionInterceptor 对象,并将其与当前被注解的方法所在的对象进行绑定。接着在业务代码中调用 @Transactional 注解的方法时,会先委托给 TransactionInterceptor 进行处理,即创建事务并开启事务。若当前已经存在事务,则继续使用当前事务,而不是创建一个新的事务。当方法执行完成后,TransactionInterceptor 会对事务进行提交或者回滚操作。同时,它也会释放当前线程所持有的连接,然后事务结束。
相关问题
spring中事务的执行流程
Spring中事务的执行流程如下:
1. 在需要进行事务管理的类或方法上添加@Transactional注解,标识该方法需要进行事务管理。
2. 当该方法被调用时,Spring会使用AOP技术,将该方法的执行过程拦截下来,在方法执行前后进行增强处理。
3. 在方法执行前,Spring会开启一个新的事务,并将该事务与当前线程进行绑定。
4. 在方法执行过程中,如果出现异常或者抛出RuntimeException,则Spring会回滚该事务,撤销所有的修改操作。
5. 如果方法执行成功,Spring会提交该事务,将所有的修改操作保存到数据库中。
6. 在方法执行完成后,Spring会将该事务与当前线程解绑,并关闭该事务。
在Spring中,事务的执行流程是通过AOP技术实现的。Spring会根据@Transactional注解的配置,动态生成代理对象,拦截被注解标记的方法的执行过程,从而实现事务的管理。通过使用Spring的事务管理功能,可以方便地管理事务,避免手动控制事务带来的繁琐和错误。
spring事务 的传播行为PROPAGATION_MANDATORY:,及其代码示例
PROPAGATION_MANDATORY 表示当前方法必须运行在一个已经存在的事务中,如果当前不存在事务,则会抛出异常。该传播行为通常用于需要依赖于外部事务的场景,例如在某个业务流程中需要依赖于上一级的事务进行操作。
以下是 PROPAGATION_MANDATORY 的示例代码:
```java
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Autowired
private TransactionTemplate transactionTemplate;
@Override
@Transactional(propagation = Propagation.MANDATORY)
public void updateUser(User user) {
userMapper.updateUser(user);
}
@Override
public void updateUserWithTransaction(User user) {
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
try {
updateUser(user);
} catch (Exception e) {
status.setRollbackOnly();
throw e;
}
}
});
}
}
```
在上述代码中,updateUser 方法使用 PROPAGATION_MANDATORY 传播行为进行事务管理,确保在调用该方法时已经存在事务。而 updateUserWithTransaction 方法则通过 TransactionTemplate 手动开启事务,并在事务中调用 updateUser 方法,以便实现对 updateUser 方法的事务控制。