[英]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.