自动启用事务的筛选器

发布时间 2023-10-29 11:32:01作者: 流浪のwolf

数据库事务是访问并可能操作各种数据项的一个数据库操i做序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位,事务由事务开始与事务结束之间的执行的全部数据库操作组成 ;

就是我们对数据库中的每个表的增删改查,把这些操作当作全体来执行,只要其中有一项出错,就会把之前执行的操作回滚;

 

数据库事务:要么全部成功,要么全部失败 ;

自动化: 启动,提交以及回滚事务。

当一段使用EFCore进行数据库操作的代码放到TransactionScope声明范围中的时候,这段代码就会被自动标记为支持事务 ;

TRansactionScope实现了IDsiposable接口,如果一个TRansactionScope的对象没有调用Complete()就执行了Dispose()方法,则事务就会被回滚,否则事务就会被提交。

TranSactionScope还支持嵌套事务。

 

 

ctx.savechanges  一个事务!

ActionDescriptor 当前被执行的方法的描述信息;
actionArguments 中是当前被执行的action方法的参数信息 ;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.Filters;
using System.Reflection;
using System.Transactions;

namespace 自动启用事务的筛选器
{
    public class TransactionScopeFilter : IAsyncActionFilter
    {
        public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            bool hasNotTransactionalAttribute = false;
            if (context.ActionDescriptor is ControllerActionDescriptor)
            {
                var actionDesc = (ControllerActionDescriptor)context.ActionDescriptor;
                hasNotTransactionalAttribute = actionDesc.MethodInfo
                    .IsDefined(typeof(NotTransactionalAttribute));
            }
            if (hasNotTransactionalAttribute)
            {
                await next();
                return;
            }
            using var txScope =
                    new TransactionScope(TransactionScopeAsyncFlowOption.Enabled);
            var result = await next();
            if (result.Exception == null)
            {
                txScope.Complete();  // 需要回滚
            }
        }
    }
}