AbpvNext 事务和工作单元

2023-08-06  本文已影响0人  Charles2018

工作单元

期望效果:假设当操作出错时从“内存”回滚 撤销所有“准备”对数据库的操作

    // [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
上一篇 下一篇

猜你喜欢

热点阅读