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语法 实现多用户并发产生不重复递增单号的一种解决方法技术参考...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mac中MacPorts安装和使用 Ma
- 下一篇: Jenkins忘记密码的修复方法(Win