簡體   English   中英

數據訪問層中的net c#lock語句

[英]net c# lock statement in data access layer

我看到了一個代碼,其中有這樣的數據訪問層:

public class CustomerDA{  

    private static readonly object _sync = new object();  
    private static readonly CustomerDA _mutex = new CustomerDA();  

    private CustomerDA(){  
    }

    public CustomerDA GetInstance(){    

        lock(_sync){      
            return _mutex;        
        }    
    }  

    public DataSet GetCustomers(){  
        //database SELECT
        //return a DataSet
    }  

    public int UpdateCustomer(some parameters){  

        //update some user
    }

}  


public class CustomerBO{  

    public DataSet GetCustomers(){  

        //some bussiness logic  
        return CustomerDA.GetInstance().GetCustomers();
    }
}

我正在使用它,但是開始思考……“如果必須構建一個有數十萬個並發用戶的類似Facebook的應用程序呢?我會阻止每個用戶執行其操作,直到前一個用戶結束他的數據庫工作了嗎? ?對於Update方法,當數據庫引擎已經在數據庫服務器級別管理並發時,在應用程序中鎖定線程是否有用?”

然后,我開始考慮將鎖移至GetCustomers和UpdateCustomer方法,但再考慮一遍:“它是否有用?”

1月3日編輯:

很好,我錯過了“ GetInstance”方法中的“ static”關鍵字。

另一件事:我的想法是,如果在同一數據訪問類中有另一個線程在工作,則沒有線程可以訪問_mutex變量。 我的意思是,我認為由於_mutex變量是從lock語句內部返回的,因此直到“;”之前,沒有線程可以訪問_mutex。 在以下句子中達到:

return CustomerDA.GetInstance().GetCustomer();

經過一些跟蹤,我意識到我做錯了假設。 您能否確認我做錯了假設?

所以...我可以肯定地說我的數據訪問層不需要任何鎖語句(即使在INSERT,UPDATE,DELETE上),並且DataAccess中的方法是靜態方法還是實例方法都沒有關系?

再次感謝...您的評論對我非常有用

該代碼中的鎖是完全沒有意義的。 它鎖定返回的值永遠不變的代碼,因此沒有理由在那里鎖定。 代碼中鎖定的目的是使對象成為單例,但是由於它不使用惰性初始化,因此根本不需要鎖定。

使數據訪問層成為單例是一個非常糟糕的主意,這意味着一次只能有一個線程可以訪問數據庫。 這也意味着該類中的方法必須使用鎖來確保一次只能訪問一個線程,否則代碼將無法正常工作。

相反,每個線程應獲得自己的數據訪問層實例,並具有與數據庫的連接。 這樣,數據庫可以解決並發問題,並且theads根本不需要進行任何鎖定。

將鎖設置在需要的位置,以便進行並發訪問。 僅在實際需要的鎖定/關鍵部分中放入盡可能多的代碼。

該GetInstance不應該是靜態的嗎?

以下偽代碼說明了GetInstance的工作方式:

  1. rval = _mutex
  2. 開鎖
  3. 返回rval

_mutex是只讀的,指的是非null對象,因此無法更改,為什么要鎖定?

如果您的數據庫提供了並發管理,但是在您的程序中創建了兩個線程,它們在等待數據的同時在自己的域中同時寫入相同的數據,那么數據庫將如何提供幫助?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM