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

  • 相关阅读:
    原生态 php连接mysql
    sql查询慢 查找
    死锁查询和处理
    linq详细案例
    linq深入
    DataTable 与XML 交互
    DataTable运用
    通过反射修改已有数组的大小
    通过反射取得并修改数组信息
    通过反射机制直接操作属性
  • 原文地址:https://www.cnblogs.com/Anthony518/p/12009641.html
Copyright © 2011-2022 走看看