【发布时间】:2011-01-01 04:49:15
【问题描述】:
我看到一个代码,他们有这样的数据访问层:
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 的应用程序,其中有数十万并发用户?我会阻止每个用户做他的事情,直到前一个用户结束他的数据库东西?对于更新方法,当数据库引擎已经在数据库服务器级别管理并发时,在应用程序中锁定线程是否有用?
然后我开始考虑将锁移至 GetCustomers 和 UpdateCustomer 方法,但再想一想:“它到底有用吗?”
1 月 3 日编辑:
没关系,我错过了“GetInstance”方法中的“static”关键字。
另一件事:我的想法是,如果有另一个线程在同一个数据访问类中工作,则没有线程可以访问 _mutex 变量。我的意思是,我认为由于 _mutex 变量是从 lock 语句内部返回的,所以在“;”之前没有线程可以访问 _mutex在以下句子中达到:
return CustomerDA.GetInstance().GetCustomer();
在进行了一些跟踪之后,我意识到我做出了错误的假设。您能否确认我做出了错误的假设?
所以...我可以肯定地说我的数据访问层不需要任何锁定语句(即使在 INSERT、UPDATE、DELETE 上)并且我的 DataAccess 中的方法是静态方法还是实例方法都没有关系?
再次感谢...您的 cmets 对我非常有用
【问题讨论】:
-
无论您在哪里看到该代码,都不要再看那里。这简直是糟糕的代码。忽略它。
-
我认为编写代码的人意味着拥有一个单例 CustomerDA。 GetInstance() 处的锁并不是真正需要的,因为 _mutex 是只读的。运行 SQL 语句时不会被阻塞,因为 GetCustomer() 和 UpdateCustomer() 处没有锁定。
标签: c# locking data-access-layer