繁体   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