博客
关于我
C# 生成编号(防并发)
阅读量:419 次
发布时间:2019-03-06

本文共 946 字,大约阅读时间需要 3 分钟。

生成编号系统设计与实现

为了满足多个业务需求下的编号生成场景,我设计并实现了一个通用编号生成系统。该系统采用年月日前缀加两位编号的模式,例如:2018101001、2018101002等。以下将详细介绍系统的设计思路、数据库表结构、存储过程实现以及相关代码逻辑。

数据库表设计

首先,创建了主表CM_CodeNo,字段包括:

  • Id(整数,自增主键)
  • CodeCate(varchar(50),分类名称,如产品编号、评估编号等)
  • VersionNum(timestamp,乐观锁版本号)
  • CodeYear、CodeMonth、CodeDay(分别对应年、月、日)
  • CodeValue(无效字段)
  • CodeCount(今日生成数量)
  • AddTime(生成时间)

该表设计考虑了乐观锁机制,通过VersionNum字段处理并发问题。

存储过程实现

存储过程LockCodeNoProc主要负责获取当前分类下的编号数量,并在并发环境下保证编号的唯一性。存储过程逻辑如下:

  • 获取当前日期的年、月、日。
  • 检查当前分类下今日已生成的编号数量。
  • 若数量为0,插入新编号。
  • 否则,获取当前分类下的最新编号,并处理并发更新。
  • C#代码实现

    在C#层,GetCodeNo方法通过调用存储过程获取编号信息。为了处理并发,采用重复请求机制,最大重试次数为10次。若IsSuccess返回false,表示发生并发,需重复请求。

    DAL层实现

    数据访问层通过DataAccessBroker调用存储过程,返回结果并转换为PortalCodeModel对象。处理结果中的IsSuccess和CodeCount字段,更新业务逻辑层。

    枚举类设计

    CodeCateEnum枚举了主要的编号分类,如现场考察、非设计类评估等,每个枚举值带有描述属性,便于展示和维护。

    模型类设计

    PortalCodeModel用于返回生成结果,包含IsSuccess和Result字段。Result表示当前分类下的最大编号值,IsSuccess表示是否成功生成。

    系统设计总结

    该系统采用乐观锁机制处理并发,确保在高并发场景下生成唯一编号。通过模块化设计,便于扩展支持更多分类和优化性能。未来可考虑增加编号格式自定义功能,提升系统的灵活性和适用性。

    转载地址:http://vvlkz.baihongyu.com/

    你可能感兴趣的文章
    ORM sqlachemy学习
    查看>>
    Ormlite数据库
    查看>>
    orm总结
    查看>>
    os.environ 没有设置环境变量
    查看>>
    os.path.join、dirname、splitext、split、makedirs、getcwd、listdir、sep等的用法
    查看>>
    os.removexattr 的 Python 文档——‘*‘(星号)参数是什么意思?
    查看>>
    os.system 在 Python 中不起作用
    查看>>
    OS2ATC2017:阿里研究员林昊畅谈操作系统创新与挑战
    查看>>
    OSCACHE介绍
    查看>>
    SQL--合计函数(Aggregate functions):avg,count,first,last,max,min,sum
    查看>>
    OSChina 周五乱弹 ——吹牛扯淡的耽误你们学习进步了
    查看>>
    SQL--mysql索引
    查看>>
    OSChina 周四乱弹 ——程序员为啥要买苹果手机啊?
    查看>>
    OSChina 周日乱弹 —— 2014 年各种奇葩评论集合
    查看>>
    OSChina 技术周刊第十期,每周技术抢先看!
    查看>>
    OSError: no library called “cairo-2“ was foundno library called “cairo“ was foundno library called
    查看>>
    OSError: [WinError 193] %1 不是有效的 Win32 应用程序。
    查看>>
    osgearth介绍
    查看>>
    OSGi与Maven、Eclipse PlugIn的区别
    查看>>
    Osgi环境配置
    查看>>