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

  • 相关阅读:
    Apache Ant 1.9.1 版发布
    Apache Subversion 1.8.0rc2 发布
    GNU Gatekeeper 3.3 发布,网关守护管理
    Jekyll 1.0 发布,Ruby 的静态网站生成器
    R语言 3.0.1 源码已经提交到 Github
    SymmetricDS 3.4.0 发布,数据同步和复制
    beego 0.6.0 版本发布,Go 应用框架
    Doxygen 1.8.4 发布,文档生成工具
    SunshineCRM 20130518发布,附带更新说明
    Semplice Linux 4 发布,轻量级发行版
  • 原文地址:https://www.cnblogs.com/Anthony518/p/12009641.html
Copyright © 2011-2022 走看看