利用AOP实现SqlSugar自动事务

参考文章

同步拦截的方法上面的文章也写清楚了,本文主要是写异步拦截

同步拦截:

	public class TransactionInterceptor : IInterceptor
    {
        private readonly TransactionAsyncInterceptor _transactionAsyncInterceptor;

        public TransactionInterceptor(TransactionAsyncInterceptor transactionAsyncInterceptor)
        {
            _transactionAsyncInterceptor = transactionAsyncInterceptor;
        }

        public void Intercept(IInvocation invocation)
        {
            _transactionAsyncInterceptor.ToInterceptor().Intercept(invocation);
        }

    }

异步拦截:

  public class TransactionAsyncInterceptor : IAsyncInterceptor
    {
        public readonly SqlSugarTransaction _sqlSugarTransaction;
        public TransactionAsyncInterceptor(SqlSugarTransaction sqlSugarTransaction)
        {
            _sqlSugarTransaction = sqlSugarTransaction;
        }
        private bool TryBegin(IInvocation invocation)
        {
            var method = invocation.MethodInvocationTarget ?? invocation.Method;
            var attribute = method.GetCustomAttributes(typeof(TransactionAttribute), false).FirstOrDefault();
            if (attribute is TransactionAttribute transaction)
            {
                _sqlSugarTransaction.BeginTran();
                return true;
            }

            return false;
        }
        private async Task InternalInterceptAsynchronous(IInvocation invocation)
        {
            invocation.Proceed();

            try
            {
                //处理Task返回一个null值的情况会导致空指针
                if (invocation.ReturnValue != null)
                {
                    await (Task)invocation.ReturnValue;
                }
                _sqlSugarTransaction.CommitTran();
            }
            catch (System.Exception)
            {
                _sqlSugarTransaction.RollbackTran();
                throw;
            }
        }

        private async Task<TResult> InternalInterceptAsynchronous<TResult>(IInvocation invocation)
        {
            TResult result;
            if (TryBegin(invocation))
            {
                try
                {
                    invocation.Proceed();
                    result = await (Task<TResult>)invocation.ReturnValue;
                    if (result is IResponseOutput res && !res.Success)
                    {
                        _sqlSugarTransaction.RollbackTran();
                    }
                    else
                    {
                        _sqlSugarTransaction.CommitTran();
                    }
                }
                catch (System.Exception)
                {
                    _sqlSugarTransaction.RollbackTran();
                    throw;
                }
            }
            else
            {
                invocation.Proceed();
                result = await (Task<TResult>)invocation.ReturnValue;
            }
            return result;
        }


        /// <summary>
        /// 拦截同步方法
        /// </summary>
        /// <param name="invocation"></param>
        public void InterceptSynchronous(IInvocation invocation)
        {
            if (TryBegin(invocation))
            {
                try
                {
                    invocation.Proceed();
                    var result = invocation.ReturnValue;
                    if (result is IResponseOutput res && !res.Success)
                    {
                        _sqlSugarTransaction.RollbackTran();
                    }
                    else
                    {
                        _sqlSugarTransaction.CommitTran();
                    }
                }
                catch
                {
                    _sqlSugarTransaction.RollbackTran();
                    throw;
                }
            }
            else
            {
                invocation.Proceed();
            }
        }

        /// <summary>
        /// 拦截返回结果为Task的方法
        /// </summary>
        /// <param name="invocation"></param>
        public void InterceptAsynchronous(IInvocation invocation)
        {
            if (TryBegin(invocation))
            {
                invocation.ReturnValue = InternalInterceptAsynchronous(invocation);
            }
            else
            {
                invocation.Proceed();
            }
        }
        /// <summary>
        ///  拦截返回结果为Task<TResult>的方法
        /// </summary>
        /// <typeparam name="TResult"></typeparam>
        /// <param name="invocation"></param>
        public void InterceptAsynchronous<TResult>(IInvocation invocation)
        {
            invocation.ReturnValue = InternalInterceptAsynchronous<TResult>(invocation);
        }


        
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Spring Boot 中,可以使用 AOP(面向切面编程)实现事务隔离级别。通过定义切面和通知,在方法执行前后进行事务管理。 下面是一个使用 AOP 实现事务隔离级别的示例代码: 1. 首先,需要在 Spring Boot 项目中引入相关依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> ``` 2. 创建一个切面类,用于定义通知和切点: ```java @Aspect @Component public class TransactionAspect { @Autowired private PlatformTransactionManager transactionManager; @Pointcut("@annotation(org.springframework.transaction.annotation.Transactional)") public void transactionalMethod() {} @Around("transactionalMethod()") public Object manageTransaction(ProceedingJoinPoint joinPoint) throws Throwable { // 获取注解上的事务属性 MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); Transactional transactional = method.getAnnotation(Transactional.class); // 创建事务定义 DefaultTransactionDefinition definition = new DefaultTransactionDefinition(); definition.setPropagationBehavior(transactional.propagation().value()); definition.setIsolationLevel(transactional.isolation().value()); // 获取事务状态 TransactionStatus status = transactionManager.getTransaction(definition); try { // 执行目标方法 Object result = joinPoint.proceed(); // 提交事务 transactionManager.commit(status); return result; } catch (Throwable ex) { // 回滚事务 transactionManager.rollback(status); throw ex; } } } ``` 在上面的代码中,`transactionalMethod` 方法用于定义切点,指定切入带有 `@Transactional` 注解的方法。`manageTransaction` 方法则是通知,在目标方法执行前后进行事务管理。在该方法中,我们根据注解上的属性值创建事务定义,并利用事务管理器执行相应的事务操作。 3. 使用 `@Transactional` 注解来标记需要进行事务管理的方法: ```java @Service public class MyService { @Transactional(isolation = Isolation.READ_COMMITTED) public void myMethod() { // 代码逻辑 } } ``` 在上面的示例中,`myMethod` 方法使用了 `@Transactional` 注解,指定了事务隔离级别为 `READ_COMMITTED`。 需要注意的是,AOP 实现事务管理是基于方法级别的,因此需要确保切面类和被切方法位于不同的类中。此外,确保切面类被 Spring Boot 扫描到,并且事务管理器已经正确配置。 通过以上步骤,你可以使用 AOP 实现事务隔离级别。当调用被 `@Transactional` 注解标记的方法时,AOP 将会拦截并根据注解中指定的隔离级别进行事务管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值