流浪のwolf

卷帝

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

自动启用事务的筛选器

数据库事务是访问并可能操作各种数据项的一个数据库操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();  // 需要回滚
            }
        }
    }
}
复制代码

 

posted on   朱龙旭的网络  阅读(15)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· Blazor Hybrid适配到HarmonyOS系统
· 支付宝 IoT 设备入门宝典(下)设备经营篇
· 万字调研——AI生成内容检测
· 解决跨域问题的这6种方案,真香!
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库
点击右上角即可分享
微信分享提示