Spring中的事务是如何实现的?
Spring中的事务管理主要有两种方式:编程式事务管理和声明式事务管理。下面分别介绍这两种方式的实现机制:

编程式事务管理

编程式事务这种比较low B,也已经out了

编程式事务管理是指通过编程的方式直接使用PlatformTransactionManager接口来管理事务。这种方式需要开发者直接处理事务的创建、提交和回滚等操作,代码侵入性较强。

import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;

public class ProgrammingTransactionManagement {

    private PlatformTransactionManager transactionManager;

    public void executeInTransaction() {
        // 定义事务属性
        DefaultTransactionDefinition def = new DefaultTransactionDefinition();
        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);

        // 获取事务状态对象
        TransactionStatus status = transactionManager.getTransaction(def);

        try {
            // 执行业务逻辑
            // ...

            // 提交事务
            transactionManager.commit(status);
        } catch (Exception ex) {
            // 回滚事务
            transactionManager.rollback(status);
            throw ex;
        }
    }
}

声明式事务管理

如何理解声明式事务基于AOP来完成?@Transactional就是一个简单粗暴的切入点。
其本质是通过AOP功能,对方法前后进行拦截,在执行方法之前开启事务,在执行完目标方法之后根据执行情况提交或者回滚事务。

下面是可能的 系统切面类,因此说声明式事务管理基于AOP



import java.lang.reflect.Method;
//标注切面类
@Aspect
@Component
public class XXX {
	private PlatformTransactionManager transactionManager;
	//切入注解名字
    @Pointcut("@annotation(com.xxx.javaaopdemo.xxxx)")
    public void pointCut(){
        //找到切点
    }
    //绑定上面的pointCut方法
    @Around("pointCut()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable{

        // 定义事务属性
        DefaultTransactionDefinition def = new DefaultTransactionDefinition();
        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);

        // 获取事务状态对象
        TransactionStatus status = transactionManager.getTransaction(def);

		try{
            //执行该方法前的通用逻辑.......
            // **** before use the method
            Object obj = joinPoint.proceed();
            //执行该方法之后的通用逻辑.....
            // **** after use the method
            transactionManager.commit(status);
        }catch(Exception ex){
			transactionManager.rollback(status);
		}
        
        //切点方法返回值
        return obj;
    }
}

声明式事务管理是通过在代码中添加注解或者在配置文件中使用XML配置来实现事务管理,这种方式更加简洁,且代码侵入性小。

  1. 使用@Transactional注解
    声明式事务管理最常用的方式是在方法上添加@Transactional注解。Spring会根据注解的属性自动进行事务的创建、提交和回滚。下面是注入了@Transaction的方法

    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    @Service
    public class MyService {
    
        @Transactional
        public void myTransactionalMethod() {
            // 业务逻辑代码
        }
    }
    
  2. AOP实现
    @Transactional注解的工作原理基于Spring AOP。Spring会在运行时为被@Transactional注解的方法创建一个代理对象,这个代理对象会在方法执行前后添加事务管理逻辑。

    Spring事务的AOP实现大致步骤如下:

    • 创建代理:Spring容器在创建Bean时,如果发现Bean上标注了@Transactional注解,会为这个Bean创建一个代理对象。
    • 拦截器链:当代理对象的方法被调用时,Spring会根据AOP的拦截器链来处理方法调用。
    • 事务增强:Spring会为@Transactional注解的方法创建一个事务增强(TransactionInterceptor),这个增强会在目标方法执行前后添加事务管理逻辑。
    • 事务管理:事务增强会使用PlatformTransactionManager来管理事务的提交和回滚。
  3. 事务属性
    @Transactional注解支持多个属性,如propagation(传播行为)、isolation(隔离级别)、timeout(超时时间)、readOnly(只读)、rollbackFornoRollbackFor(定义哪些异常会导致事务回滚)等,允许开发者自定义事务的行为。

通过声明式事务管理,Spring提供了一种简洁且强大的事务管理机制,使得开发者可以轻松地在应用中实现事务控制,保证数据的一致性和完整性。

如果有不懂AOP的可参考下面的

https://blog.csdn.net/weixin_46028606/article/details/143689162?fromshare=blogdetail&sharetype=blogdetail&sharerId=143689162&sharerefer=PC&sharesource=weixin_46028606&sharefrom=from_link

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部