首页 新闻 搜索 专区 学院

如何调用方法生成不重复并且递增的流水号

0
悬赏园豆:20 [待解决问题]

条件:
1.流水号规则是配置的,需要先从数据库表里读取配置(有可能包含前缀、时间、流水号)
2.表结构是主表是编码 副表: 编码Id, 类型(前缀、时间、流水号),值(WX、yyyyMMdd、 00001)

   public string MakeOddNumber(string code)
        {
            using (var conn = DapperHelper.GetConn())
            {
                string oddNumber = string.Empty;

                var oddNumberCreate = conn.QueryFirstOrDefault<JcOddNumberCreateTab>($"select * from dbo.JcOddNumberCreateTab where Code = '{code}'");
                if (oddNumberCreate == null)
                {
                    return string.Empty;
                }
                var oddNumberCreateDetails = conn.Query<JcOddNumberCreateDetailTab>($"select * from dbo.JcOddNumberCreateDetailTab where OddCode = '{oddNumberCreate.Id}' order by Sort");

                string waterNum = string.Empty;

                foreach (var oddNumberCreateDetail in oddNumberCreateDetails)
                {
                    string val = oddNumberCreateDetail.OddFormatValue;
                    if (oddNumberCreateDetail.OddFormatType == "流水号")
                    {
                        int number = 0;
                        int.TryParse("1" + val, out number);
                        number++;
                        waterNum = number.ToString().Substring(1);
                        oddNumber += waterNum;
                    }
                    else if (oddNumberCreateDetail.OddFormatType == "时间")
                    {
                        oddNumber += DateTime.Now.ToString(oddNumberCreateDetail.OddFormatValue);
                    }
                    else
                    {
                        oddNumber += oddNumberCreateDetail.OddFormatValue;
                    }
                }
                var trans = conn.BeginTransaction();
                try
                {
                    conn.Execute($"update dbo.JcOddNumberCreateDetailTab set OddFormatValue = '{waterNum}' where OddCode = '{oddNumberCreate.Id}' and OddFormatType = '流水号'", null, trans);
                    conn.Execute($"update dbo.JcOddNumberCreateTab set CurrentOddCode = '{oddNumber}' where Code = '{code}'", null, trans);
                    trans.Commit();
                }
                catch (Exception ex)
                {
                    trans.Rollback();
                    return "";
                }
                return oddNumber;
            }
        }

在多次调用会出现重复

QT2019的主页 QT2019 | 初学一级 | 园豆:10
提问于:2021-10-15 08:18
< >
分享
所有回答(2)
1

1、redis 桶算法——安排一个进程,定期往桶里放 流水号
2、试试雪花算法(分布式ID神器之雪花算法简介 - 知乎,,Twitter的SnowFlake)

快乐的凡人721 | 园豆:1379 (小虾三级) | 2021-10-15 08:22
0

加锁,保证方法是同步执行的,只是性能差点,加事务,保证更新都持久化了

素手揽清风 | 园豆:219 (菜鸟二级) | 2021-10-15 16:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册