Sinnvollstes Sperrkonzept in folgender Situation...



  • In unserer Anwendung gibt es Zeitbezogene Daten. Wenn ein Anwender an diesen Daten eine Änderung vornimmt muss sichergestellt werden, das gleichzeitig kein anderer Benutzer diesen und den Zielzeitraum (sofern der Zeitraum geändert wird) anpasst. Sprich: Zeitraumbezogen weder Insert/Update noch Delete für andere Benutzer zulassen.

    Bislang werden die entsprechenden Tabellen immer im ganzen gesperrt, die Tabellensperre ist aber zu restriktiv. Eine Datensatzsperre alleine in den Zieltabellen funktioniert auch nicht (Insert muss auch unterbunden werden...).

    Mein Vorschlag ist etwas über zwei Ecken gedacht: Einfügen einer Tabelle mit einer Auflistung aller möglichen Tage und einen Zeitstempel; für eine Sperre werden dann die entsprechenen Tage verändert [Zeitstempel umgesetzt] so das ein anderer Prozess diese selbst während der laufenden Transaktion nicht mehr ändern kann.

    Hat jemand eine bessere Idee (Muss auf einer Clientdatenbank wie Access ebenso laufen wie unter SQL-Server)?



  • Was meinst du eigentlich mit Zeitbezogene Daten? Wenn etwas im September liegt und es in den Oktober verschoben werden soll darf niemand weiter Daten im September/Oktober bearbeiten?



  • witte schrieb:

    Was meinst du eigentlich mit Zeitbezogene Daten? Wenn etwas im September liegt und es in den Oktober verschoben werden soll darf niemand weiter Daten im September/Oktober bearbeiten?

    Es handelt sich im wesentlichen um Datensätze die eine Ressourcenbelegung nach sich Ziehen. Im einfachsten Fall kann man es sich als Kalender mit Terminen vorstellen, bei dem niemals eine Person zweimal zu einem Termin eingetragen werden darf. Mögliche Änderungen an einem solchen Termin wären z.B. die Änderung der Ressourcen (Personen) oder des Termines (Und mein Vorschlag ist etwas weniger Extrem wie bislang: Ich würde die Sperre zumindest für den Speichermoment auf die betroffenen Tage begrenzen).



  • Muss auf einer Clientdatenbank wie Access ebenso laufen wie unter SQL-Server

    Beim SQL-Server sollte sich das Problem von alleine Lösen, wenn du
    😉 alles in eine Transaktion packst
    😉 die Bedingungen ("kann ich den Eintrag machen ohne dass Unsinn rauskommt") in der Transaktion verifizierst, bevor du Änderungen machst
    😉 einen passenden TRANSACTION ISOLATION LEVEL (ala SERIALIZABLE) verwendest

    IIRC lockt SQL Server dann alles, was er braucht, um die diversen Ergebnisse für Abfragen in der Transaktion zu bestimmen. Soll heissen: wenn du ein "WHERE a = 5 AND b BETWEEN x AND y" in einer Abfrage hast, dann wird SQL-Server entweder selbst einen TABLE LOCK holen, oder aber einen passenden INDEX LOCK, falls ein passender Index vorhanden ist (was er dann sein sollte).

    Natürlich solltest du das ganze nochmal anhand der Doku und mit ein paar Tests verifizieren, denn es kann natürlich sein dass ich da was falsch verstanden oder falsch in Erinnerung habe.

    Was Access angeht... keine Ahnung. Vielleicht könnte man bei Access ja auch weiterhin die Table-Lock Variante beibehalten. Access wird im Multi-User Betrieb ja sowieso furchtbar langsam, ist also sowieso nicht wirklich gut für Multi-User Anwendungen geeignet. Vielleicht wäre es also verschmerzbar, da die alte Table-Lock Variante beizubehalten.



  • Für mich hört sich das eher nach Unique Constraints an. So dass man Ressourcen zeitlich verplant und einen eindeutigen Schlüssel über Zeitraum und Ressource legt. Dann muß allerdings eine Zeitraumüberlappungsprüfung erfolgen.



  • @witte
    Aber wie soll man diese "Zeitraumüberlappungsprüfung" machen?
    Ich wüsste mit SQL Server keine Möglichkeit das gebacken zu bekommen.
    Und mit Access schon garnicht.



  • hustbaer schrieb:

    Was Access angeht... keine Ahnung. Vielleicht könnte man bei Access ja auch weiterhin die Table-Lock Variante beibehalten.

    ...die Leider über Komponenten gemacht wird, die ich demnächst entfernen muss...
    (Umstellung auf ADO und dort ist das Setzen des Tablelock bei Access nicht möglich)



  • witte schrieb:

    Für mich hört sich das eher nach Unique Constraints an. So dass man Ressourcen zeitlich verplant und einen eindeutigen Schlüssel über Zeitraum und Ressource legt. Dann muß allerdings eine Zeitraumüberlappungsprüfung erfolgen.

    Da liegst du in der Annahme nicht verkehrt, nur kenne ich keine DB die bei einem Key außer Eindeutigkeit auch ein Bereich unterstützt...



  • Und wenn man dann einen Trigger nimmt der vor dem Einfügen/Aktualisieren die bereits vorhandenen Daten auf Überlappungen prüft? Access kennt keine Trigger, hat aber dennoch Funktionen. Kann man diese zum Aktualisieren aufrufen die die Prüfung vornehmen und im Erfolgsfall den Eintrag vornehmen? Ich weiß nicht ob das geht.



  • asc schrieb:

    hustbaer schrieb:

    Was Access angeht... keine Ahnung. Vielleicht könnte man bei Access ja auch weiterhin die Table-Lock Variante beibehalten.

    ...die Leider über Komponenten gemacht wird, die ich demnächst entfernen muss...
    (Umstellung auf ADO und dort ist das Setzen des Tablelock bei Access nicht möglich)

    Bist du sicher dass es in "Jet-SQL" keine Möglichkeit gibt einen Table-Lock zu setzen?

    Oder vielleicht könnt ihr den Access-Support ja gleich ganz droppen 🙂



  • Also bei INSERT/UPDATE ist das ja alles kein Problem. Verstehe aber die ANforderung noch nicht ganz. Möchtest Du beim SELECT die DAten schon sperren damit kein andere die Daten selektieren kann?
    Da ist folgendes Problem: Wieviel Zeit hat der SELECTOR die Daten zu ändern?
    Was wenn er in die Mittagspause, Feierabend,Urlaub geht?
    Dann darf niemand die Daten selektieren also braucht man eine Freigabe.
    Da sollte man eine Zeitrahmen definieren um die Daten freizugeben falls sie nicht verändert wurden. (in MSSQL kein Problem)
    RDBMS wurde ja hier nicht gesagt oder?



  • hustbaer schrieb:

    Oder vielleicht könnt ihr den Access-Support ja gleich ganz droppen 🙂

    Dagegen hat mein Chef etwas 😉 Auch wenn ich davon angetan wäre...



  • Unix-Tom schrieb:

    Also bei INSERT/UPDATE ist das ja alles kein Problem. Verstehe aber die ANforderung noch nicht ganz. Möchtest Du beim SELECT die DAten schon sperren damit kein andere die Daten selektieren kann?
    Da ist folgendes Problem: Wieviel Zeit hat der SELECTOR die Daten zu ändern?
    Was wenn er in die Mittagspause, Feierabend,Urlaub geht?
    Dann darf niemand die Daten selektieren also braucht man eine Freigabe.
    Da sollte man eine Zeitrahmen definieren um die Daten freizugeben falls sie nicht verändert wurden. (in MSSQL kein Problem)
    RDBMS wurde ja hier nicht gesagt oder?

    Die Sperre soll möglichst innerhalb des Speichervorganges gesetzt werden (Wo dann noch über ein Select vorsichtshalber ein Abgleich geschieht). Bislang dauert dieser Vorgang (und das nur auf der größten Datenbank in einem extremen Spezialfall) etwa eine halbe Minute. Sprich: Die Prüfung/Sperrung etc. sollte nicht die Anwendung blockieren wenn einer meint eine Maske in auf alle Ewigkeiten geöffnet zu lassen.


Anmelden zum Antworten