在 ASP.NET Core 中自动启用 CAP 事务
1.聊聊分布式事务,再说说解决方案2.CAP 8.0 版本发布通告 - CAP 7岁生日快乐!3.CAP 7.2 版本发布通告4.CAP 7.1 版本发布通告5.CAP 7.0 版本发布通告 - 支持延迟消息,性能炸了?6.CAP 6.2 版本发布通告7.CAP 6.1 版本发布通告8.CAP 6.0 版本发布通告 - 支持 OpenTelemetry9.CAP 5.2 版本发布通告10.CAP 5.1 版本发布通告 - 你期待的 Redis 来了11.CAP 5.0 版本发布通告12.CAP 3.1 版本发布通告13.CAP 3.0 版本发布通告14.CAP 2.6 版本发布通告15.CAP 2.5 版本发布通告16.CAP 2.4版本发布通告 - 支持版本隔离特性17.CAP 2.3版本发布通告 - 支持 MongoDB18..NET Core 事件总线,分布式事务解决方案:CAP19.CAP 介绍及使用【视频】20.招募:Wiki 文档翻译小伙伴招募21.分布式事务,EventBus 解决方案:CAP【中文文档】22.在 CAP 中使用 AOP ( Castle.DynamicProxy )23.如何在你的项目中集成 CAP【手把手视频教程】
24.在 ASP.NET Core 中自动启用 CAP 事务
25.CAP 8.1 版本发布通告26.CAP 8.2 版本发布通告27.一文带你了解CAP的全部特性,你学会了吗?28.CAP 8.3 版本发布通告本篇文章旨在描述如何在 ASP.NET Core项目中并以一种简便的方式启用CAP事务,因为在我们的示例中都是直接演示比较直观的方式,没有进行封装,有些初学者同学不太会,找到问我如何封装,本篇文章主要是一个简单的演示。
在本示例中 ,我们主要是基于 Entity Framework 来进行演示,如果你使用其他 Orm 原理类似,大家参考即可。
发布端事务
由于大部分人都是在 Web 中使用,所以可以通过使用 ASP.NET Core 过滤器的方式进行,当然也可以通过中间件,原理是一致的。
1、创建一个 TypeFilter,命名为 CapTransactionFilterAttribute
public class CapTransactionFilterAttribute : TypeFilterAttribute
{
public CapTransactionFilterAttribute() : base(typeof(TransactionActionFilter))
{
}
public class TransactionActionFilter : IActionFilter
{
private IDbContextTransaction _transaction;
public void OnActionExecuting(ActionExecutingContext context)
{
var dbContext = context.HttpContext.RequestServices.GetRequiredService<AppDbContext>();
var capPublisher = context.HttpContext.RequestServices.GetService<ICapPublisher>();
_transaction = dbContext.Database.BeginTransaction(capPublisher);
}
public void OnActionExecuted(ActionExecutedContext context)
{
if (context.Exception == null)
{
_transaction.Commit();
}
else
{
_transaction.Rollback();
}
_transaction?.Dispose();
}
}
}
2、使用方式,在需要进行事务控制的 Action 上添加 [TypeFilter(typeof(CapTransactionFilterAttribute))]
即可生效。
[Route("~/ef/trans-filter")]
[TypeFilter(typeof(CapTransactionFilterAttribute))]
public IActionResult EntityFrameworkWithTransactionFilter(
[FromServices] AppDbContext dbContext)
{
dbContext.Persons.Add(new Person() { Name = "ef.transaction" });
_capBus.Publish("sample.rabbitmq.mysql", DateTime.Now);
dbContext.SaveChanges();
return Ok();
}
消费端事务
消费端自动事务主要利用 CAP 提供的过滤器来进行开启,需要 CAP 版本大于 5.1.0。
1、创建一个 CAP 过滤器
public class MyCapFilter : SubscribeFilter
{
private readonly AppDbContext _dbContext;
private IDbContextTransaction _transaction;
public MyCapFilter(AppDbContext dbContext)
{
_dbContext = dbContext;
}
public override void OnSubscribeExecuting(ExecutingContext context)
{
_transaction = _dbContext.Database.BeginTransaction();
}
public override void OnSubscribeExecuted(ExecutedContext context)
{
_transaction.Commit();
}
public override void OnSubscribeException(DotNetCore.CAP.Filter.ExceptionContext context)
{
_transaction.Rollback();
}
}
2、配置过滤器
services.AddCap(opt =>
{
// ***
}.AddSubscribeFilter<MyCapFilter>();
以上就是消费端的一个简单示例。
本文地址:http://www.cnblogs.com/savorboard/p/cap-auto-transaction.html
作者博客:Savorboard
本文原创授权为:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?