自动启用事务的筛选器
数据库事务是访问并可能操作各种数据项的一个数据库操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(); // 需要回滚 } } } }