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%以上的都沒考慮應用程序並發問題及數據庫的並發問題,若不是迫不得已越簡單越省事就好,何必跟自己過不去呢,搞那么多繁瑣的並發處理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM