首页 > 其他分享 >Abp-工作单元应用场景注意事项

Abp-工作单元应用场景注意事项

时间:2024-11-05 18:00:44浏览次数:4  
标签:blog 场景 false await Abp 注意事项 true public InsertAsync

Abp-工作单元应用场景注意事项

事务工作单元=数据库事务+工作单元事务。

Controller

[ApiController]
[Route("[controller]")]
public class BlogController : AbpController
{
    private BlogAppService _blogAppService => LazyServiceProvider.LazyGetRequiredService<BlogAppService>();
    public BlogController()
    {
    }
    
    [HttpPost("Add")]
    public async Task<IResultOutput> AddBlogAsync(AddBlogInputDto input)
    {
        return ResultOutput.Ok(await _blogAppService.AddBlogAsync1(input));
    }
}

Service

自动工作单元

Abp默认具有的方式。

InsertAsync方法第二个参数autosave的值默认为false,代表不开启数据库事务,值为true时代表开启数据库事务。有以下几点需要注意

  1. 无论设置为false还是true,插入之后都必须等待工作单元事务提交,数据才会进入到数据库表中。例如下面代码执行完InsertAsync方法后数据是不会入库的,而是等待Controller层的AddBlogAsync方法执行完之后才会入库,即工作单元事务提交之后才会入库。
  2. 无论设置为false还是true,执行完InsertAsync方法都可以拿到blog的Id值,但是切记若设置为false,则在工作单元事务未提交前不可以根据此Id值去数据库表做查询操作,此时会报异常。除非设置为true。
  3. 无论设置为false还是true,若InsertAsync方法执行是成功的,但在工作单元事务提交前检测到其它地方存在异常,此时数据不会入库。
  4. 当值为false时,若实体属性本身赋值存在问题,例如实体某属性的值超过了数据库表对应字段指定的长度,此时执行完InsertAsync方法后不会报错,但是程序运行结束会报错,数据也不会入库;而当值为true时,程序执行InsertAsync方法便会立即报错,终止工作单元事务的提交,数据也不会入库。
 public class BlogAppService : ApplicationService
 {
     public async Task<Guid> AddBlogAsync1(AddBlogInputDto inputDto)
     {
         var blog = await _blogRepository.InsertAsync(ObjectMapper.Map<AddBlogInputDto, Blog>(inputDto));
         //var blog = await _blogRepository.InsertAsync(ObjectMapper.Map<AddBlogInputDto, Blog>(inputDto),true);
         if (blog != null)
         {
             var blog1 = await _blogRepository.GetAsync(blog.Id); //autosave为false时查询会报错查不到,除非设置为true
             //do something
         }
         blog.CreationTime = _clock.Now;
         return blog.Id;
     }	
 }

手动工作单元

_unitOfWorkManager.Begin()方法的第二个参数isTransactional,代表是否开启工作单元事务,默认为false不开启,为true则开启,有几点注意事项

  1. Begin()的isTransactional设置为false,InsertAsync()的autosave设置为true,代表不开启工作单元事务,开启数据库事务,此时执行完InsertAsync方法后数据就会入库。
 public class BlogAppService : ApplicationService
 {
     private IUnitOfWorkManager _unitOfWorkManager =>LazyServiceProvider.LazyGetRequiredService<IUnitOfWorkManager>();
     public async Task<Guid> AddBlogAsync1(AddBlogInputDto inputDto)
     {
         using(var uow = _unitOfWorkManager.Begin(true,false))
         {
             var blog = await _blogRepository.InsertAsync(ObjectMapper.Map<AddBlogInputDto, Blog>(inputDto), true);
             blog.CreationTime = _clock.Now;
             return blog.Id;
         }
     }	
 }
  1. Begin()的isTransactional设置为true,InsertAsync()的autosave设置为true,代表既开启工作单元事务,也开启数据库事务,此时直到程序结束数据都不会入库,也不会报错。必须加上await uow.Commit()这句代码,当执行这句代码后数据便会入库。
public class BlogAppService : ApplicationService
{
    private IUnitOfWorkManager _unitOfWorkManager =>LazyServiceProvider.LazyGetRequiredService<IUnitOfWorkManager>();
    public async Task<Guid> AddBlogAsync1(AddBlogInputDto inputDto)
    {
        using(var uow = _unitOfWorkManager.Begin(true,true))
        {
            var blog = await _blogRepository.InsertAsync(ObjectMapper.Map<AddBlogInputDto, Blog>(inputDto), true);
            blog.CreationTime = _clock.Now;
            //await uow.Commit();  手动提交工作单元
            return blog.Id;
        }
    }	
}
  1. Begin()的isTransactional设置为false,InsertAsync()的autosave设置为false,代表既不开启工作单元事务,也不开启数据库事务,此时数据不会入库。也不会报错。但是若加上await uow.Commit()这句代码,当执行这句代码后数据便会入库(不推荐这么做)。
public class BlogAppService : ApplicationService
{
    private IUnitOfWorkManager _unitOfWorkManager =>LazyServiceProvider.LazyGetRequiredService<IUnitOfWorkManager>();
    public async Task<Guid> AddBlogAsync1(AddBlogInputDto inputDto)
    {
        using(var uow = _unitOfWorkManager.Begin(true,false))
        {
            var blog = await _blogRepository.InsertAsync(ObjectMapper.Map<AddBlogInputDto, Blog>(inputDto), false);
            blog.CreationTime = _clock.Now;
            //await uow.Commit();  手动提交工作单元
            return blog.Id;
        }
    }	
}
  1. Begin()的isTransactional设置为true,InsertAsync()的autosave设置为false,代表开启工作单元事务,不开启数据库事务,此时数据不会入库。也不会报错。但是若加上await uow.Commit()这句代码,当执行这句代码后数据便会入库。
public class BlogAppService : ApplicationService
{
    private IUnitOfWorkManager _unitOfWorkManager =>LazyServiceProvider.LazyGetRequiredService<IUnitOfWorkManager>();
    public async Task<Guid> AddBlogAsync1(AddBlogInputDto inputDto)
    {
        using(var uow = _unitOfWorkManager.Begin(true,true))
        {
            var blog = await _blogRepository.InsertAsync(ObjectMapper.Map<AddBlogInputDto, Blog>(inputDto), false);
            blog.CreationTime = _clock.Now;
            //await uow.Commit();  手动提交工作单元
            //do something
            return blog.Id;
        }
    }	
}

标签:blog,场景,false,await,Abp,注意事项,true,public,InsertAsync
From: https://www.cnblogs.com/mingcore/p/18528453

相关文章

  • 覆盖80%业务场景,原生鸿蒙出行、教育行业样板间专区上线
    华为原生鸿蒙之夜获得广泛关注,华为官宣鸿蒙生态设备数量已超过10亿台,鸿蒙原生应用和元服务数量已超过15000个,鸿蒙生态已进入飞速发展阶段。为更好地助力各行业开发者降本提效开发鸿蒙原生应用和元服务,华为开发者联盟生态市场(简称生态市场)近日上线了原生鸿蒙出行行业、教育行业“样......
  • AI带货主播背景替换与虚拟场景融合的源代码!
    AI带货主播作为新兴的直播形式,正在逐步改变我们的购物体验,借助先进的人工智能技术,带货主播可以在虚拟环境中进行直播,背景可以实时替换,场景也可以灵活变换。这不仅增强了直播的趣味性,也大大提升了观众的沉浸感,接下来,本文将分享一些关于AI带货主播背景替换与虚拟场景融合的源代......
  • 覆盖80%业务场景,原生鸿蒙出行、教育行业样板间专区上线
    华为原生鸿蒙之夜获得广泛关注,华为官宣鸿蒙生态设备数量已超过10亿台,鸿蒙原生应用和元服务数量已超过15000个,鸿蒙生态已进入飞速发展阶段。为更好地助力各行业开发者降本提效开发鸿蒙原生应用和元服务,华为开发者联盟生态市场(简称生态市场)近日上线了原生鸿蒙出行行业、教育行业“样......
  • HAL_UART_RxCpltCallback与HAL_UARTEx_RxEventCallback使用场景
    1.HAL_UART_RxCpltCallback()是在接收到启动时设置的字节数(启动接收时需要设置接收数据长度)后的回调。适用于标准的接收模式,比如使用HAL_UART_Receive_IT或HAL_UART_Receive_DMA启动的接收。在处理完接收数据后,还需要重新启动接收(要在回调函数中调用HAL_UART_Receive_IT或HAL_......
  • vue常用的指令用途和注意事项
    vue常用的指令用途和注意事项v-bindv-ifv-forv-modelv-showv-bind:class和v-bind:stylev-onv-slot总结v-bind用途:动态绑定元素的属性或特性。代码:<template><imgv-bind:src="imageSrc"alt="Vuelogo"><av-bind:href="linkUrl">ClickHere&......
  • 享元模式及其运用场景:结合工厂模式和单例模式优化内存使用
    介绍享元模式(FlyweightPattern)是一种结构型设计模式,它通过共享对象来减少内存使用,尤其是对于大量相似对象的场景。享元模式通常与工厂模式和单例模式结合使用,从而有效地控制和复用对象的创建。在享元模式中,享元对象的核心思想是将不可变的部分(共享的状态)和可变的部分(外部......
  • 语忆科技携手火山引擎数据飞轮 探索智能客服场景新可能
     放弃支付、申请退款、购后差评……消费者在电商平台的每一项操作背后,其实都有原因。 而这些原因,往往深藏于消费者与商家客服沟通的十几条甚至几十条对话之中。 在杭州语忆科技有限公司CTO魏志成看来,消费者与商家客服的沟通内容,其实是品牌商的一项重要数据资产,“一......
  • 淘宝API接口注意事项及要点
    淘宝API接口的使用有诸多注意事项及要点,具体如下:一、注册与认证:账号注册:首先要在淘宝开放平台上注册开发者账号,这是使用API的前提。认证流程:完成相关认证,确保具备合法使用API的权限。注册并认证成功后,创建应用以获取API密钥(appkey和appsecret),这是后续调用API接口的......
  • 国标GB28181网页直播平台EasyGBS国标GB28181软件与GB28181应用场景分析
    随着5G、AI、云计算、大数据、物联网等新兴技术的快速发展,各行各业都在积极探索智能化、现代化的管理与运营模式。国标GB28181网页直播平台EasyGBS作为一款基于国标GB28181协议的视频云服务平台,凭借其强大的功能和广泛的应用场景,在众多领域中展现出了独特的优势。一、EasyGBS......