[英]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的工作方式:
_mutex是只讀的,指的是非null對象,因此無法更改,為什么要鎖定?
如果您的數據庫提供了並發管理,但是在您的程序中創建了兩個線程,它們在等待數據的同時在自己的域中同時寫入相同的數據,那么數據庫將如何提供幫助?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.