C# ASP.NET B/S模式下,采用lock语法 实现多用户并发产生不重复递增单号的一种解决方法技术参考...
往往我们在开发程序、调试程序时,无法模拟多用户同时操作的实际环境下的运行情况。
为了模拟多用户并发操作,我们先写个多线程的例子来充分模拟多用户并发的情况
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 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%以上的都没考虑应用程序并发问题及数据库的并发问题,若不是迫不得已越简单越省事就好,何必跟自己过不去呢,搞那么多繁琐的并发处理。
转载于:https://www.cnblogs.com/BrokenIce/p/6272664.html
C# ASP.NET B/S模式下,采用lock语法 实现多用户并发产生不重复递增单号的一种解决方法技术参考...相关推荐
- pe下找不到ssd硬盘_【进入pe系统后认不到硬盘解决方法】进入pe系统看不到硬盘_pe系统不认硬盘...
2014-01-07 11:11:42 有个别朋友在使用一键U盘装系统工具安装系统,在进入pe装系统时发现找不到电脑硬盘了,接下来看看小编为大家带来的解决方法! 2017-03-01 17:01:06 ...
- 多iframe下的html同名id,获得同级iframe页面的指定ID元素的几种实现方法
1.JS实现: var object= window.parent.frames("要获得的iframe的name").contentDocument.getElementById ...
- html 下拉组件被下面的组件挡住,div被select下拉框挡住了--5种解决方法
在IE中,select属于window类型控件,它会"挡住"所有非window类型控件 可以这么理解,div这样的组件是在浏览器客户区使用代码"渲染"的, 他们 ...
- html 下拉组件被下面的组件挡住,select挡住div的5种解决方法
在IE中,select属于window类型控件,它会"挡住"所有非window类型控件 可以这么理解,div这样的组件是在浏览器客户区使用代码"渲染"的, 他们 ...
- oracle10在w7下提示无法定位,Win7提示无法定位程序输入点 于动态链接库的原因及解决方法...
无法定位程序输入点 于动态链接库上这是怎么回事?Win7系统下,用户经常是在电脑开机的时候遇到这个提示,或是在运行网络游戏及单机游戏时也会出现这种情况,偶尔也会在运行某个程序软件时显示无法找到入口,无 ...
- cmd下运行java文件时,找不到或无法加载主类的解决方法
最近再看java,却被一个看似很基础的hellorworld头疼了十几分钟,百度了一下,若你在cmd下编辑及运行.java文件时报错,解决方案如下,如图所示: d盘根目录下的.java文件. 打开cm ...
- python环境配置(一)——Linux下将python2.6升级到2.7 安装pip 以及升级中遇到问题的解决方法
python2.6版本有很多局限性:最重要的就是,当前最新的pip版本已经不再支持python2.6:这给我们安装很多python库增加了很多不便:所以这里把我升级python2.6--2.7的过程及 ...
- 关闭自动降频 linux,在Deepin系统下CPU不能自主降频的两种解决方法
如果你在Deepin系统下遇到CPU不能自主降频的问题,可用以下两种方法来解决.因为测试了一下针对笔记本装Deepin系统有时候遇到不能自主降频的问题,导致温度过高,结果用解决方法一处理好了.相关参考 ...
- html5 ul下的li重叠解决,firefox中div重叠覆盖之前ul的两种解决方法
第一种: 在模板中定义了一段代码,用于实现"推荐阅读"功能. 在实现过程中,包含如下代码: 复制代码代码如下: 推荐阅读 [e:loop={'selfinfo',10,2,0}] ...
最新文章
- LAMP服务搭建详解
- c++ 互斥量和条件变量
- [MetalKit]14-Ray-tracing-in-a-Swift-playground5射线追踪5
- dine with the dean judge business school
- ASp.net中Froms验证方式
- .NET Core容器化之多容器应用部署@Docker-Compose
- [Leedcode][JAVA][第94/144/145题][前中后序遍历][递归][迭代][二叉树]
- win7 php zend,win7系统打开WZend Studio PHP出错的解决方法
- 1-1.Win10系统利用Pycharm社区版安装Django搭建一个简单Python Web项目的步骤之一
- CI框架PHP漫画小说二合一CMS网站系统源码
- 在shell中获取当前机器的ip地址
- SQL 获取当前日期
- html5 几何酷站,10个值得学习的HTML5+CSS3视觉特效酷站欣赏
- 软件测试行业到底有没有前景和出路?软件测试职业发展方向总结
- 命令查看yarn当前任务列表
- 微信抢票开发实践总结
- 07-SparkStreaming
- STC12C5A60S2单片机驱动超声波
- 位运算的奇技淫巧:Bit Twiddling Hacks
- wxpython入门(1)
热门文章
- 初中数学知识遗忘记录(持续更新中)
- Django静态文件小结
- Found option without preceding group
- 最简洁的y460显卡切换安装方式
- 2.2 矩阵基本运算
- vs 无法解析变量$_C语言新手常见错误(Vs使用,语法...),绝对直击痛点
- lasso回归_线性回归amp;lasso回归amp;岭回归介绍与对比
- geth 以太坊钱包_以太坊Geth节点RPC API中文文档
- php数组循环便利,浅析PHP中for与foreach两个循环结构遍历数组的区别
- Java并发与锁设计实现详述 - Java中的Condition