标签:自定义 写入 next Filter TransactionScopeAsyncFlowOption context var TransactionScopeF
如果一个方法内有多个写入操作,比如 写入A表,然后用A表的自增id 去写入B表,假如A表写入成功,但B表因为某种原因写入失败!(这就导致A表写入了脏数据)
这时候 我们可以自定义 一个Filter 进行拦截判断是否需要这个方法开启事务
using var txScope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled); // TransactionScopeAsyncFlowOption.Enabled是开启异步的时候必须要传入这个参数
builder.Services.Configure<MvcOptions>(options =>
{
options.Filters.Add<TransactionScopeFilter>();
});
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)); //判断Action 上是否有NotTransactionalAttribute 如果有就跳过 没有反之
}
if (hasNotTransactionalAttribute) //判断方法上是否 [NotTransactional]
{
await next(); //不开启事务 直接执行下一个
return;
}
using var txScope =
new TransactionScope(TransactionScopeAsyncFlowOption.Enabled); // C# 10的写法 只能在VS 2022
var result = await next();
if (result.Exception == null)
{
txScope.Complete();
}
}
}
在不需要验证的方法上标识 [NotTransactional] (也可以更改上面的代码 if 非 即可 标识 为开启)
标签:自定义,写入,next,Filter,TransactionScopeAsyncFlowOption,context,var,TransactionScopeF 来源: https://www.cnblogs.com/Bo-H/p/16584454.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。