C# ASP.NET B/S模式下,采用lock语法 实现多用户并发产生不重复递增单号的一种解决方法技术参考

简介:

有时候也好奇,若是老外发个技术文章,会不会到处是有人骂街的?进行人身攻击的?中国人喜欢打击别人,不知道老外是不是也是这个性格?好奇的问一下大家。

 

往往我们在开发程序、调试程序时,无法模拟多用户同时操作的实际环境下的运行情况。

为了模拟多用户并发操作,我们先写个多线程的例子来充分模拟多用户并发的情况

代码
     class  SequenceTest
    {
        
///   <summary>
        
///  定义委托
        
///   </summary>
        
///   <param name="user"> 用户 </param>
         delegate   void  MakeSequenceDelegate( string  user);

        
///   <summary>
        
///  这里是测试序列
        
///   </summary>
        
///   <param name="user"> 用户 </param>
         private   void  MakeSequence( string  user)
        {
            
for  ( int  i  =   0 ; i  <   10 ; i ++ )
            {
                BaseSequenceManager sequenceManager 
=   new  BaseSequenceManager();
                
//  模拟2010年7月份的订单编号产生
                System.Console.WriteLine(user  +   " "   +  sequenceManager.GetSequence( " Order201007 " ));
            }
        }

        
///   <summary>
        
///  这里是模拟多用户同时点击
        
///   </summary>
         public   void  DoTest()
        {
            
//  模拟3个用户的并发操作
            MakeSequenceDelegate sequenceDelegate1  =   new  MakeSequenceDelegate(MakeSequence);
            sequenceDelegate1.BeginInvoke(
" user1 " null null );
            MakeSequenceDelegate sequenceDelegate2 
=   new  MakeSequenceDelegate(MakeSequence);
            sequenceDelegate2.BeginInvoke(
" user2 " null null );
            MakeSequenceDelegate sequenceDelegate3 
=   new  MakeSequenceDelegate(MakeSequence);
            sequenceDelegate3.BeginInvoke(
" user3 " null null );
        }
    }

 

序列表的设计效果如下图,表中存储了当前是什么序列的序号为多少等信息。

 

由于没进行并发控制,程序的输出情况如下,当然在单用户操作测试时,是不太可能测试出并发情况下的运行状态的。

这里会有重复序列急丢失序列的情况会发生,并不能保证多用户并发时,能完全产生唯一的订单编号。

为什么会发生并发问题? 因为你在读的时候,我也在读,你在更新序列时,我也在更新序列,因为相同的程序在运行多份,用户1,2同时都读到了0007这个序号。

 

进行并发控制后的运行效果如下:

这里序号是连续的,而且是没有丢失情况,也没重复情况发生。

 

这里是如何避免并发?BaseSequenceManager中进行了如下排斥并发的加工。

            

           

            private static readonly object SequenceLock = new object();

 

    string returnValue = string.Empty;

            // 这里用锁的机制,提高并发控制能力
            lock (SequenceLock)
            {

                    returnValue = 读取数据库中的当前序列值(一)

                    更新数据库中的序列(二)

            }

            return  returnValue;

   

因为数据库的读取,更新,需要2步操作,是导致了并发问题的所在。

 

以上文章主要涉及到如下技术问题:

1:需要能写出多线程的模拟程序。

2:多线程函数如何传递参数需要学会。

3:这也算是所谓的核心基础组件的自动化测试吧。

4: lock 语句(C# 参考) http://msdn.microsoft.com/zh-cn/library/c5kehkcz(VS.80).aspx

 

测试起来好用的管理软件,真正投放到实际生产环境中往往会发生很多意想不到的错误,这往往是没能重复测试多用户并发情况下的运行情况导致的占一部分。

以上程序虽然没什么大难度,下午耗费了接近2-3个小时,才调整好,希望对读者评估工作量能有个参考。

 

估计在国内的管理类软件,90%以上都没进行严格的多用户并发测试,90%以上的都没考虑应用程序并发问题及数据库的并发问题,若不是迫不得已越简单越省事就好,何必跟自己过不去呢,搞那么多繁琐的并发处理。

 

将权限管理、工作流管理做到我能力的极致,一个人只能做好那么很少的几件事情

本文转自jirigala_bao 51CTO博客,原文链接:http://blog.51cto.com/jirigala/806814

相关文章
|
3月前
|
SQL 小程序 API
如何运用C#.NET技术快速开发一套掌上医院系统?
本方案基于C#.NET技术快速构建掌上医院系统,结合模块化开发理念与医院信息化需求。核心功能涵盖用户端的预约挂号、在线问诊、报告查询等,以及管理端的排班管理和数据统计。采用.NET Core Web API与uni-app实现前后端分离,支持跨平台小程序开发。数据库选用SQL Server 2012,并通过读写分离与索引优化提升性能。部署方案包括Windows Server与负载均衡设计,确保高可用性。同时针对API差异、数据库老化及高并发等问题制定应对措施,保障系统稳定运行。推荐使用Postman、Redgate等工具辅助开发,提升效率与质量。
130 0
|
7月前
|
开发框架 搜索推荐 算法
一个包含了 50+ C#/.NET编程技巧实战练习教程
一个包含了 50+ C#/.NET编程技巧实战练习教程
219 18
|
7月前
|
缓存 算法 安全
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
205 12
|
7月前
|
开发框架 人工智能 .NET
C#/.NET/.NET Core拾遗补漏合集(24年12月更新)
C#/.NET/.NET Core拾遗补漏合集(24年12月更新)
|
7月前
|
开发框架 算法 .NET
C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)
C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)
|
7月前
|
开发框架 Cloud Native .NET
C#/.NET/.NET Core技术前沿周刊 | 第 16 期(2024年12.01-12.08)
C#/.NET/.NET Core技术前沿周刊 | 第 16 期(2024年12.01-12.08)
|
7月前
|
开发框架 监控 .NET
C#进阶-ASP.NET WebForms调用ASMX的WebService接口
通过本文的介绍,希望您能深入理解并掌握ASP.NET WebForms中调用ASMX WebService接口的方法和技巧,并在实际项目中灵活运用这些技术,提高开发效率和应用性能。
363 5
|
8月前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
150 3
|
7月前
|
存储 安全 编译器
学懂C#编程:属性(Property)的概念定义及使用详解
通过深入理解和使用C#的属性,可以编写更清晰、简洁和高效的代码,为开发高质量的应用程序奠定基础。
345 12
|
8月前
|
设计模式 C# 图形学
Unity 游戏引擎 C# 编程:一分钟浅谈
本文介绍了在 Unity 游戏开发中使用 C# 的基础知识和常见问题。从 `MonoBehavior` 类的基础用法,到变量和属性的管理,再到空引用异常、资源管理和性能优化等常见问题的解决方法。文章还探讨了单例模式、事件系统和数据持久化等高级话题,旨在帮助开发者避免常见错误,提升游戏开发效率。
298 4