zoukankan      html  css  js  c++  java
  • C#生成唯一不重复订单号

    在弄电商类网站的时候,往往是根据年月日时分秒的格式生成订单号(yyyyMMddHHmmss),为了解决并发性,就直接在生成订单号的区域块加上lock。
      下面,我们来简单测试一下。
    1.新建项目(控制台应用程序)
    2.新建一个类:OrderIdHelper.cs
     /// <summary>
     /// 订单助手
     /// </summary>
     class OrderIdHelper
     {
       private static readonly object Locker = new object();
       private static string _tempId = "";
    
       /// <summary>
       /// 生成订单编号
       /// </summary>
       public static void GenerateId()
       {
         lock (Locker)  //lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区。
         {
           var orderId = "Wen" + DateTime.Now.ToString("yyyyMMddHHmmss"); //年月日时分秒
    
           if (string.Equals(_tempId, orderId))
           {
             throw new Exception("订单号重复!");
           }
    
           _tempId = orderId;
    
           Console.WriteLine(orderId);
         }
       }
     }
    
    
    3.Program.cs
     class Program
     {
       static void Main(string[] args)
       {
         //创建包含两个线程的数组
         var threads = new Thread[2]
         {
           new Thread(OrderIdHelper.GenerateId),
           new Thread(OrderIdHelper.GenerateId),
         };
    
         foreach (var thread in threads)
         {
           //线程启动
           thread.Start();
         }
    
         Console.Read();
       }
     }
    
    
    4.结果:=====OrderIdDemo_1.rar 点我下载=====
    5.发现一个不错的订单号生成规则,稍作改动: 不重复订单号生成规则(原网址)
    /// <summary>
    /// 订单助手
    /// </summary>
    public class OrderHelper
    {
      /// <summary>
      /// 防止创建类的实例
      /// </summary>
      private OrderHelper() { }
    
      private static readonly object Locker = new object();
      private static int _sn = 0;
    
      /// <summary>
      /// 生成订单编号
      /// </summary>
      /// <returns></returns>
      public static string GenerateId()
      {
        lock (Locker)  //lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区。
        {
          if (_sn == int.MaxValue)
          {
            _sn = 0;
          }
          else
          {
            _sn++;
          }
          
          Thread.Sleep(100);
    
          return "Wen" + DateTime.Now.ToString("yyyyMMddHHmmss")+ _sn.ToString().PadLeft(10, '0');
        }
      } 
    }
    
    
     6.关于使用GUID的个人见解。
     ①不清楚生成的时间,不方便管理。
      ②官方解释:GUID 是一个 128 位整数(16 字节),可用于所有需要唯一标识符的计算机和网络。 此标识符重复的可能性非常小。

    1

  • 相关阅读:
    策略模式 Web.Net版 [原理+代码] 鸭子呱呱叫
    关于onMouseOut违背逻辑关系的解决办法!
    js漂浮组件发布 ppFloat.js.1.0
    (转)跟我一起制作数据采集获取淘宝网店宝贝数据信息(二)
    (转)WCF学习笔记(一)——WCF基础
    (转)IIS负载均衡Application Request Route详解第一篇: ARR介绍
    (转)【原创】说说JSON和JSONP,也许你会豁然开朗,含jQuery用例
    (转)HTTP与Tcp协议下双工通信的差异
    (转)一个仿新浪微博的网站 mvc ado
    (转)微软开源的项目和架构学习
  • 原文地址:https://www.cnblogs.com/Anthony518/p/12009641.html
Copyright © 2011-2022 走看看