abp mysql 事务_手工搭建基于ABP的框架 - 工作单元以及事务管理

本文详细介绍了ABP框架中工作单元(Unit of Work, UoW)和事务管理的实现原理,以及如何自定义工作单元以适配数据库事务。通过分析ABP的源码,展示了从开始到结束的工作单元生命周期,并提供了重构LocalDbSessionProvider以优化数据库Session管理和事务处理的方法。" 118919579,7549583,苹果开发者账号与APP上架AppStore全面指南,"['iOS开发', 'AppStore', '移动开发', '苹果开发者', '软件发布']
摘要由CSDN通过智能技术生成

一个业务功能往往不只由一次数据库请求(或者服务调用)实现。为了功能的完整性,我们希望如果该功能执行一半时出错,则撤销前面已执行的改动。在数据库层面上,事务管理实现了这种完整性需求。在ABP中,一个完整的业务功能称为一个工作单元(Unit of Work,简称UoW)。工作单元代表一种完整的、原子性的操作。即一个工作单元包含的步骤要么全部被执行,要么都不被执行。如果执行一半时出现异常,则必须讲已执行的步骤还原。通常我们将事务管理实现在工作单元中。下面我们从ABP源码入手研究如何使用工作单元。

ABP工作单元(UoW)的工作原理

ABP默认将工作单元应用在Repositories、 Application Services、MVC控制器和Web API控制器等组件。也就是说,这些组件的每个方法都是一个工作单元。ABP文档对工作单元的原理讲得不是很详细,所以我们只能通过源码进行研究。这里我们以MVC控制器为例来了解一下ABP工作单元大致的工作原理。源码分析比较枯燥,最好配套ABP源码阅读,或者跳到后面看粗体字结论。

ABP在Web模块初始化时注册了过滤器AbpMvcUowFilter。AbpMvcUowFilter在请求处理前(OnActionExecuting方法)调用UnitOfWorkManager.Begin方法来开始一个工作单元。UnitOfWorkManager.Begin创建一个IUnitOfWork的实例并赋值给ICurrentUnitOfWorkProvider.Current,然后调用IUnitOfWork.Begin方法开始一个工作单元。在请求处理结束后(OnActionExecuted方法)如果处理过程没有异常就调用IUnitOfWork.Complete方法完成工作单元,并且无论请求处理是否成功,都调用IUnitOfWork.Dispose来结束工作单元。

ABP提供了一个实现IUnitOfWork的抽象基类UnitOfWorkBase,另外还有个继承了UnitOfWorkBase的类NullUnitOfWork。NullUnitOfWork定义上面有一段注释如此写到:

///

/// Null implementation of unit of work.

/// It's used if no component registered for .

/// This ensures working ABP without a database.

///

public sealed class NullUnitOfWork : UnitOfWorkBase

NullUnitOfWork是一个“空”的工作单元,它不会做任何操作。如果我们没有在IoC容器中注册其它IUnitOfWork的实现类,则ABP默认使用不做任何事的NullUnitOfWork作为工作单元。所以如果我们要做一些保证功能完整性的工作(比如开启数据库事务),就要实现IUnitOfWork并注册到IoC容器。

阅读UnitOfWorkBase可以看到,UnitOfWorkBase分别在Begin方法、Complete方法和Dispose方法中调用了BeginUow方法、CompleteUow方法和DisposeUow方法。我们需要重写的主要是BeginUow、CompleteUow和DisposeUow这三个方法。

通过源码简单了解了原理后,我们后面写代码要注意的有下面几点:

写一个继承UnitOfWorkBase的类Unit

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值