工作单元
期望效果:假设当操作出错时从“内存”回滚 撤销所有“准备”对数据库的操作
// [UnitOfWork(IsDisabled = false)] 可以忽略 默认开启
// 如果设置IsDisabled = true 注意uow.Begin将不起作用
// 如果设置IsDisabled = true 也会导致当前AddTest方法 工作单元无法回滚
public async Task<IMGroupDto?> AddTest()
{
// 插入到内存 直至当前AddTest方法执行结束并无BUG才会真实插入到数据库
var e = await _groupRepository.InsertAsync(new IMGroup()
{
GroupName = "Test",
GroupId = "123",
GroupType = Enums.GroupTypeEnum.Work,
GroupAddOpt = Enums.GroupJoinOptionsEnum.GROUP_ADD_ANY,
});
// 从数据库查询 注意这里的从数据库查询将返回null
var o = await _groupRepository.FindAsync(e.Id);
// 模拟抛出错误让当前工作单元回滚
if (o is null) throw new NullReferenceException();
return ObjectMapper.Map<IMGroup, IMGroupDto>(o);
}
运行结果.png
数据库事务
期望效果:假设当操作出错时从“数据库”回滚 撤销所有"已经对数据库的更改"
public async Task<IMGroupDto?> AddTest()
{
// requiresNew:true 是否开启新的 工作单元或事务
// isTransactional:true 如果未true 就开启真实数据库事务
using (var uow = _unitOfWorkManager.Begin(requiresNew:true,isTransactional:true))
{
try
{
var e = await _groupRepository.InsertAsync(new IMGroup()
{
GroupName = "Test",
GroupId = "123",
GroupType = Enums.GroupTypeEnum.Work,
GroupAddOpt = Enums.GroupJoinOptionsEnum.GROUP_ADD_ANY,
});
await uow.SaveChangesAsync(); // 保存到数据库
// 从数据库查询
var o = await _groupRepository.FindAsync(e.Id);
throw new ApplicationException("模拟抛错");
await uow.CompleteAsync();
return ObjectMapper.Map<IMGroup, IMGroupDto>(o);
}catch (Exception ex)
{
// 回滚
await uow.RollbackAsync();
}
}
return null;
}
运行结果.png