Wie kann die Nebenläufigkeit in einer Datenbankzugriffsanwendung am besten verwaltet werden?

8

Vor einiger Zeit habe ich eine Anwendung geschrieben, die von mehreren Benutzern verwendet wird, um die Erstellung von Trades zu verwalten. Ich habe seit einiger Zeit keine Entwicklung mehr gemacht, und ich kann mich nicht erinnern, wie ich die Parallelität zwischen den Benutzern geschafft habe. Daher suche ich einen Rat in Sachen Design.

Die ursprüngliche Anwendung hatte die folgenden Merkmale:

  • Ein schwerer Client pro Benutzer.
  • Eine einzige Datenbank.
  • Zugriff auf die Datenbank für jeden Benutzer zum Einfügen / Aktualisieren / Löschen von Trades.
  • Ein Raster in der Anwendung, das die Handelstabelle widerspiegelt. Dieses Raster wird jedes Mal aktualisiert, wenn jemand einen Deal ändert.
  • Ich benutze WPF.

Hier ist was ich frage mich:

  1. Habe ich Recht, wenn ich daran denke, dass mir die Verbindung zur Datenbank für jede Anwendung egal ist? Wenn man bedenkt, dass es in jedem einen Singleton gibt, würde ich eine Verbindung pro Client ohne Problem erwarten.

  2. Wie kann ich die Parallelität der Zugriffe verhindern? Ich denke, ich sollte beim Ändern der Daten sperren, aber nicht daran erinnern, wie es geht.

  3. Wie richte ich das Grid so ein, dass es automatisch aktualisiert wird, wenn meine Datenbank aktualisiert wird (z. B. von einem anderen Benutzer)?

Vielen Dank im Voraus für Ihre Hilfe!

    
Goul 13.01.2011, 14:43
quelle

2 Antworten

2
  1. Erwägen Sie, Connection Pooling zu nutzen, um die Anzahl der Verbindungen zu reduzieren. Siehe: Ссылка

  2. sperren Sie so spät wie möglich und veröffentlichen Sie sie so bald wie möglich, um die Nebenläufigkeit zu maximieren. Sie können TransactionScope verwenden (siehe Ссылка und Ссылка ) wenn Sie mehrere db-Aktionen haben, die zusammen gehen müssen Konsistenz zu verwalten oder einfach nur in DB Stored Proc zu behandeln. Halten Sie Ihre Anfrage einfach. Befolgen Sie die folgenden Tipps, um zu verstehen, wie Sperren funktionieren und wie Sie Ressourcenkonflikte und Deadlocks verringern können: Ссылка

  3. Ich bin mir nicht sicher, andere db, aber für SQL, können Sie SQL-Abhängigkeit verwenden, siehe Ссылка

Jimmy Chandra 13.01.2011, 15:34
quelle
3

Parallelität wird normalerweise vom DBMS mit Sperren gewährt. Sperren sind eine Art von Semaphoren, die einer bestimmten Ressource die exklusive Sperre gewähren und ermöglichen, dass andere Zugriffe eingeschränkt oder in eine Warteschlange eingereiht werden (nur eingeschränkt, wenn Sie nicht abgearbeitete Lesevorgänge verwenden).

Die Anzahl der Verbindungen selbst stellt kein Problem dar, wenn Sie keine Höhen erreichen, bei denen Sie die Einstellung max_connections Ihres DBMS berühren könnten. Andernfalls kann es zu Problemen bei der Verbindung zu Wartungszwecken oder zum Herunterfahren kommen.

DBMS verwenden normalerweise ein Konzept von Tabellensperren (MyISAM) oder Zeilensperren (InnoDB, die meisten anderen DBMSe). Die Art des Schlosses bestimmt das Volumen des Schlosses. Tabellensperren können sehr schnell sein, werden jedoch normalerweise als Sperren auf Zeilenebene betrachtet.

Sperren auf Zeilenebene treten innerhalb einer Transaktion auf (implizit oder explizit). Wenn Sie eine Transaktion manuell starten, beginnen Sie mit dem Transaktionsbereich. Solange Sie den Transaktionsbereich nicht manuell schließen, sind alle von Ihnen vorgenommenen Änderungen Attribute dieser exakten Transaktion. Die Änderungen, die Sie vornehmen, folgen auch dem ACID-Paradigma .

Der Transaktionsumfang und dessen Verwendung ist ein viel zu langes Thema für diese Plattform. Wenn Sie möchten, kann ich einige Links veröffentlichen, die mehr Informationen zu diesem Thema enthalten.

Bei den automatischen Aktualisierungen unterstützen die meisten Datenbanken eine Art von Auslösemechanismus, bei dem es sich um Code handelt, der bei bestimmten Aktionen in der Datenbank ausgeführt wird (z. B. beim Erstellen eines neuen Datensatzes oder beim Ändern eines Datensatzes). Sie könnten Ihren Code innerhalb dieses Triggers veröffentlichen. Sie sollten jedoch nur eine empfangene Anwendung der Änderungen informieren, nicht wirklich die Änderungen des Triggers "tun", auch wenn die Sprache dies möglich macht. Denken Sie daran, dass die Aktion, die den Code ausgelöst hat, ausgesetzt wird, bis Sie mit Ihrem Triggercode fertig sind. Dies bedeutet, dass ein magerer Trigger am besten ist, wenn er überhaupt benötigt wird.

    
0xCAFEBABE 13.01.2011 15:27
quelle