彻底解决商城订单号重复问题

Hailin 发表于 2017-11-16 06:48:24 来源于CMS插件网 评论 0 点击 2050
摘要:DTcms自带的商城订单,存在订单号重复的问题,今天我们来说说如果彻底解决这个问题!

相信这个问题不止小编一个人遇到,这个问题可大可小;如果你还没有修复这个BUG,请认真看完这篇文章;

首先我们来看一下DTcms自带的生成订单号的方法中

/// <summary>
/// 根据日期和随机码生成订单号
/// </summary>
/// <returns></returns>
public static string GetOrderNumber()
{
    string num = DateTime.Now.ToString("yyMMddHHmmss");//yyyyMMddHHmmssms
    return num + Number(2, true).ToString();
}
/// <summary>
/// 生成随机数字
/// </summary>
/// <param name="Length">生成长度</param>
/// <param name="Sleep">是否要在生成前将当前线程阻止以避免重复</param>
/// <returns></returns>
public static string Number(int Length, bool Sleep)
{
    if (Sleep)
        System.Threading.Thread.Sleep(3);
    string result = "";
    System.Random random = new Random();
    for (int i = 0; i < Length; i++)
    {
        result += random.Next(10).ToString();
    }
    return result;
}

我们可以看到,这里用到了线程等待,但是这根本解决不了问题;我们通过模拟50个线程来获取订单号

static void Main(string[] args)
{
    for (int i = 0; i < 50; i++)
    {
        // 并发启动多线程
        Thread thread = new Thread(new ThreadStart(GetUserRoleName));
        thread.Start();
    }
    Console.Read();
}

private static void GetUserRoleName()
{
    Console.WriteLine(GetOrderNumber());
}

QQ截图20171116183755.png

从输出的结果中,我们可以看出,输出的订单号,大部分都是重复的;现在我们将线程数改为10个,在来看看;

QQ截图20171116183923.png

可以看出基本上全是一样的;现在我们来说说如何修复这个问题,在数据库中,限制订单表中的订单号唯一约束

--增加订单号唯一约束
ALTER TABLE dt_orders ADD CONSTRAINT AK_DT_ORDERS_ORDERNO UNIQUE (order_no);

这样可以保证我们数据表中不会有重复的订单号,但是程序中我们还没有解决,至于程序修改这个根据自己需要,可以上百度上查询一下!


附件列表

  • 点击下载附件:线程订单号测试.rar 大小14KB 所需积分:0分 下载次数:104次

热门资讯