sah ich einen Code, in dem sie die Datenzugriffsschicht wie dieses:net C# lock-Anweisung in der Datenzugriffsschicht
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();
}
}
ich es verwenden, aber anfangen zu denken ... „und was ist, wenn bauen musste eine Facebook-ähnliche Anwendung, wo es Hunderttausende von gleichzeitigen Benutzern gibt? würde ich jeden Benutzer daran hindern, seine Sachen zu machen, bis der vorherige Benutzer seine Datenbank-Sachen beendet? und für die Update-Methode, ist es nützlich, THREADS in der App zu sperren, wenn Datenbank Engines verwalten bereits Parallelität auf Datenbankserverebene? "
Dann begann ich über das Verschieben der Sperre zu den GetCustomers und UpdateCustomer Methoden nachzudenken, aber denken Sie noch einmal: "Ist es überhaupt nützlich?"
bearbeiten am Januar 03:
Sie alles in Ordnung sind, verpasste ich die "statische" Schlüsselwort in der "GetInstance" -Methode.
Anther Sache: Ich war in der Idee, dass kein Thread auf die Variable _mutex zugreifen konnte, wenn ein anderer Thread in der gleichen Datenzugriffsklasse arbeiten würde. Ich meine, ich dachte, seit die _mutex-Variable von innerhalb der Lock-Anweisung zurückgegeben wird, konnte kein Thread auf die _mutex zugreifen, bis die ";" wurde im folgenden Satz erreicht:
return CustomerDA.GetInstance().GetCustomer();
Nach einiger Verfolgung tun, merke ich, ich die falsche Annahme machte. Könnten Sie bitte bestätigen, dass ich die falsche Annahme gemacht habe?
So ... Kann ich sicher sagen, dass meine Datenzugriffsebene keine Sperranweisung benötigt (selbst bei INSERT, UPDATE, DELETE) und dass es keine Rolle spielt, ob Methoden in meinem DataAccess statische oder Instanzmethoden sind?
Thanks again ... Ihre Kommentare sind mir so nützlich
Wo immer Sie diesen Code gesehen haben, schauen Sie nie wieder dorthin. Das ist einfach schlechter Code. Ignoriere es. –
Ich glaube, derjenige, der den Code geschrieben hat, sollte einen Singleton von CustomerDA haben. Die Sperre bei GetInstance() ist nicht wirklich notwendig, da _mutex schreibgeschützt ist. Sie werden nicht blockiert, wenn Sie die SQL-Anweisungen ausführen, da es bei GetCustomer() und UpdateCustomer() keine Sperre gibt. –