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

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

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


    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 = ; i < ; 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%以上的都没考虑应用程序并发问题及数据库的并发问题,若不是迫不得已越简单越省事就好,何必跟自己过不去呢,搞那么多繁琐的并发处理。

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

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

  1. iis7下url重写后,已存在的html不能访问了(未能执行URL)的解决方法

    iis7下url重写后,原本存在的html不能访问了,未能执行URL(asp.net对真正的.html(但不符合重写规的)就不知道如何处理了),遇到类似情况的朋友可以参考下   当把.html的url ...

  2. Visual Studio 6.0 在 Windows 10 下崩溃的一种解决方法

    Visual Studio 6.0 下载地址: https://winworldpc.com/product/microsoft-visual-stu/60 安装步骤: https://www.cod ...

  3. cmd下运行java文件时,找不到或无法加载主类的解决方法

    最近再看java,却被一个看似很基础的hellorworld头疼了十几分钟,百度了一下,若你在cmd下编辑及运行.java文件时报错,解决方案如下,如图所示:

  4. 写给大忙人的centos下ftp服务器搭建(以及启动失败/XFTP客户端一直提示“用户身份验证失败”解决方法)

    注:个人对偏向于底层基本上拿来就用的应用,倾向于使用安装包,直接yum或者rpm安装:而对于应用层面控制较多或者需要大范围维护的,倾向于直接使用tar.gz版本. 对于linux下的ftp服务器,实际 ...

  5. VMware下CentOS7安装后,还原虚拟网络后,敲ifconfig不显示局域网ip解决方法

    VMware下CentOS7安装后,还原虚拟网络后,敲ifconfig不显示局域网ip,没有出现eth0网卡,不能上网,SSH不能连接,输入ifconfig后如下图: 解决方法: 1.编辑网卡的配置文 ...

  6. linux lnmp下无法使用mail发邮件的两种解决方法

    在配置了lnmp环境后,出现了mail函数不能发送邮件的问题,其实有两种方法,一是使用sendmail组件,而是使用postfix. 方法一,使用sendmail组件来发邮件  1.安装 sendma ...

  7. Javascript教程:js异步模式编程的4种解决方法

    随着人们对网站视觉效果及用户体验的要求越来越高,所以在未来网站的建设中,设计师们开始越来越多的使用了js文件来达到预期的效果,随着js文件的越来越多,令设计师们最头痛的事情也就来了,那就是Javasc ...

  8. ASP+中文显示之两种解决方法

    作者刚開始写ASP+程序时候碰到的第一个比較大的问题就是中文显示问题,执行后发现ASP+从数据库中读  取出来的中文所有变成了?????,有点相似jsp中的这个频率出现最高的中文显示问题了,查了资料发 ...

  9. VM下的linux系统上不了网?? 使用putty远程登录不上linux的解决方法?

    背景:昨晚想尝试一下用putty远程登录我的linux系统,悲剧的是,我竟然连接不上,显示 connection refused   ,连接被拒绝.于是我就想看看能不能在linux下看看能不能访问百度 ...

随机推荐

  1. 代码管理(三)sourcetree 的使用

    一.SourceTree简介   SourceTree 是 Windows 和Mac OS X 下免费的 Git 和 Hg 客户端,拥有可视化界面,容易上手操作.同时它也是Mercurial和Subv ...

  2. C语言中的 (void*)0 与 (void)0

    前几天看到一个宏, 它大概是这样的: #define assert_param(expr) ((expr) ? (void)0 : assert_failed((u8 *)__FILE__, __LI ...

  3. Linux下实现脚本监测特定进程占用内存情况

    Linux系统下,我们可以利用以下命令来获取特定进程的运行情况: cat /proc/$PID/status 其中PID是具体的进程号,这个命令打印出/proc/特定进程/status文件的内容,信息 ...

  4. Failed to resolve: 之一

    摘要:编译不通过提示错误如下:gradle文件里边对应:解决方案:在gradle文件里边加上.+,解决后gradle文件如下图所示:然后编译就能通过. 解决方案: 在gradle文件里边加上.+,解决 ...

  5. 10.翻译:EF基础系列---EF中的持久性

    原文链接:http://www.entityframeworktutorial.net/EntityFramework4.3/persistence-in-entity-framework.aspx ...

  6. npm的影武者 —— Npx

    npx github:https://github.com/zkat/npx 什么是Npx?它和npm是什么关系? 如果你把NPM升级到最新版本npm@5.2.0 ,它就会安装一个新的包npx $ n ...

  7. OOM killer(Out Of Memory killer)

    最近接连遇到两个情况就是接连进程把kill掉 第一个情况就是有一个java进程被kill了.原因是我这个服务器上海部署了一个node服务,这个node服务大家都不熟悉.所以在使用的时候没有注意内存的使 ...

  8. 使用vs的查找功能,简单大概的统计vs中的代码行数

    VS强大的查找功能,可以使用正则表达式来进行查找,这里统计代码行数的原理就是: 在所有指定文件中进行搜索,统计匹配的文本行数. 但是匹配的行需要满足:非注释.非空等特殊非代码行. 使用Ctrl+Shi ...

  9. tomcat启动时出现了Failed to start component [StandardEngine[Catalina].StandardHost[localhost]]等错误

    tomcat 启动时报错:Failed to start component [StandardEngine[Catalina].StandardHost[localhost]]等错误 解决办法: 是 ...

  10. 对于android浏览器的一些看法

    首先我先声明我不是一个浏览器开发者,只是近段时间看了一些关于浏览器的东西,才有一些看法. 在几年前开发手机的web 页面,都经常因为JS插件不兼容android WebView内核,导致开发浪费大量时 ...