none
Information zu Tabellenveränderungen im Multiuser-Umfeld RRS feed

  • Frage

  • Guten Tag

    Ich habe eine Applikation programmiert, die mehrere User gleichzeitig benutzen. Beim Starten werden die nötigen DB-Tabellen mit Fill() geladen und im Memory gehalten. Veränderungen werden sofort mit ..update(table) abgespeichert, sind also in der DB enthalten. Ein anderer User hat aber diese Veränderungen NICHT in seinem Memory!

    Bisher umgehe ich das Problem, indem ich vor relevanten Prozessen eine Fill-Abfrage starte um sicher die momentan aktuellen Daten zu haben. Das führt aber zu vielen unnötigen Abfragen.

    Meine Frage ist: Gibt es eine Notifikation für die User-Instanz, dass sich der Tabelleninhalt verändert hat, also ein neuer Fill-Aufruf nötig ist?

    Besten Dank für einen Hinweis

    Christophe

    Donnerstag, 24. Juni 2010 12:17

Antworten

  • Hallo Christophe,
    selbst wenn es diese Benachrichtigung geben würde, ist mir nicht klar, wie Du grössere Transaktionen bzw. (fast) gleichzeitige Updates damit behandeln willst.
    Eine Multi-User-Anwendung sollte höchstens Read-Only-Tabellen im Speicher halten und sich ansonsten an die Mechanismen der Datenbank für Abfragen und Sperrungen halten. So geht z. B. auch MS-Access vor einem Update erst mal hin und prüft mit einem Select, ob die Datensätze noch unverändert vorhanden sind und sperrt sie für das Update.

    Bei der Verwendung eines Application-Servers hast Du auch nur eine zentrale Instanz, die die Datenintegrität sicherstellt.
    So eine verteilte Anwendung wie von Dir be(ge)schrieben, wird nur Probleme verursachen.

    Einen schönen Tag noch,
    Christoph


    Microsoft SQL Server MVP
    http://www.insidesql.org

    Freitag, 25. Juni 2010 09:39
  • Hallo Christophe,

    mit dem MS SQL Server 2005 wurde der SQL Server Notification Services eingeführt, der Nachrichten bei Datenänderungen senden kann; und in MS SQL Server 2008 gleich wieder ersatzlos entfernt.

    Wie Christoph schon schrieb, ist es am sinnigsten vor dem Schreiben zu prüfen, ob zwischenzeitlich die Daten geändert wurden. Dazu bietet es sich an, eine Spalte vom Typ RowVersion (früher TimeStamp) anzulegen, die automatisch bei jeder Änderung aktualisiert wird. ADO.NET bietet dazu dann sogar eine native Unterstützung an, um auf Änderungen zu prüfen, siehe z.B. Row States and Row Versions

     


    Olaf Helper ----------- * cogito ergo sum * errare humanum est * quote erat demonstrandum * Wenn ich denke, ist das ein Fehler und das beweise ich täglich http://olafhelper.over-blog.de
    Freitag, 25. Juni 2010 09:55
  • Hallo Christophe,

    eine Möglichkeit sieht die Abfragebenachrichtigungen, siehe
    Abfragebenachrichtigungen in SQL Server (ADO.NET)

    Wobei Du dabei sehr viel Traffic erzeugen kannst,
    wenn Du dies bei größeren Tabellen mit vielen Änderungen
    auf alle Daten anwendest.
    Sinnvoll ist das eigentlich nur bei solchen Tabellen,
    die eher selten verändert werden, z. B. Stammdaten.

    Bei Bewegungsdaten gibt es zudem wenig Sinn, weil parallele
    Bearbeitungen dadurch nicht unterbunden werden
    und Du ohnehin eine Konfliktlöse-Strategie brauchst.

    Anstatt immer alles im Speicher zu halten, ist es häufig sinnvoller,
    nur die wirklich bearbeiteten Daten abzurufen.
    Denn der SQL Server hat einen hochoptimierten Cache;
    den durch ein DataSet ein weiteres mal zu implementieren,
    ist Eulen nach Athen tragen.

    Gruß Elmar
    Freitag, 25. Juni 2010 15:12
    Beantworter

Alle Antworten

  • Hallo Christophe,
    selbst wenn es diese Benachrichtigung geben würde, ist mir nicht klar, wie Du grössere Transaktionen bzw. (fast) gleichzeitige Updates damit behandeln willst.
    Eine Multi-User-Anwendung sollte höchstens Read-Only-Tabellen im Speicher halten und sich ansonsten an die Mechanismen der Datenbank für Abfragen und Sperrungen halten. So geht z. B. auch MS-Access vor einem Update erst mal hin und prüft mit einem Select, ob die Datensätze noch unverändert vorhanden sind und sperrt sie für das Update.

    Bei der Verwendung eines Application-Servers hast Du auch nur eine zentrale Instanz, die die Datenintegrität sicherstellt.
    So eine verteilte Anwendung wie von Dir be(ge)schrieben, wird nur Probleme verursachen.

    Einen schönen Tag noch,
    Christoph


    Microsoft SQL Server MVP
    http://www.insidesql.org

    Freitag, 25. Juni 2010 09:39
  • Hallo Christophe,

    mit dem MS SQL Server 2005 wurde der SQL Server Notification Services eingeführt, der Nachrichten bei Datenänderungen senden kann; und in MS SQL Server 2008 gleich wieder ersatzlos entfernt.

    Wie Christoph schon schrieb, ist es am sinnigsten vor dem Schreiben zu prüfen, ob zwischenzeitlich die Daten geändert wurden. Dazu bietet es sich an, eine Spalte vom Typ RowVersion (früher TimeStamp) anzulegen, die automatisch bei jeder Änderung aktualisiert wird. ADO.NET bietet dazu dann sogar eine native Unterstützung an, um auf Änderungen zu prüfen, siehe z.B. Row States and Row Versions

     


    Olaf Helper ----------- * cogito ergo sum * errare humanum est * quote erat demonstrandum * Wenn ich denke, ist das ein Fehler und das beweise ich täglich http://olafhelper.over-blog.de
    Freitag, 25. Juni 2010 09:55
  • Hallo Christoph und Olaf

     

    Vielen Dank für Eure Hinweise. Irgendwie verstehe ich etwas falsch, glaube ich.

    Folgendes Szenario:

    - Ich habe einen Applikationsserver, dort rufen die User Instanzen auf, die Daten vom Server holen.

    - User 1 öffnet ein Fenster, lädt eine Tabelle in ein Grid (mit xxx.fill())

    - User 2 öffnet dasselbe Fenster in seiner Instanz, lädt dieselbe Tabelle in ein Grid

    - User 1 verändert einen Satz, schliesst das Fenster und die Änderung wird mit x..update() geschrieben. Mit korrekter Prüfung und Sperrung.

    - User 2 sieht nun die Änderung noch NICHT in seinem Grid. Ich möchte in diesem Moment (mit Info an User 2) das Grid mit den aktualisierten Informationen neu laden. Die Frage ist nur, wie weiss die Instanz von User2 von der Änderung?

     

    Ist das nicht ein übliches Szenario? Oder ist mein Ansatz falsch?

     

    Besten Dank für Eure Unterstützung.

    Christophe

    Freitag, 25. Juni 2010 12:28
  • Hallo Christophe,

    eine Möglichkeit sieht die Abfragebenachrichtigungen, siehe
    Abfragebenachrichtigungen in SQL Server (ADO.NET)

    Wobei Du dabei sehr viel Traffic erzeugen kannst,
    wenn Du dies bei größeren Tabellen mit vielen Änderungen
    auf alle Daten anwendest.
    Sinnvoll ist das eigentlich nur bei solchen Tabellen,
    die eher selten verändert werden, z. B. Stammdaten.

    Bei Bewegungsdaten gibt es zudem wenig Sinn, weil parallele
    Bearbeitungen dadurch nicht unterbunden werden
    und Du ohnehin eine Konfliktlöse-Strategie brauchst.

    Anstatt immer alles im Speicher zu halten, ist es häufig sinnvoller,
    nur die wirklich bearbeiteten Daten abzurufen.
    Denn der SQL Server hat einen hochoptimierten Cache;
    den durch ein DataSet ein weiteres mal zu implementieren,
    ist Eulen nach Athen tragen.

    Gruß Elmar
    Freitag, 25. Juni 2010 15:12
    Beantworter