Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: Datenbanken ::  Multiuserbetrieb und Zeilen zeitweise Sperren, sowas wie ein "Edit-Flag". Gute Idee?     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
UndEsIstSommer...
Unregistrierter




Beitrag UndEsIstSommer... Unregistrierter 17:28:39 11.03.2010   Titel:   Multiuserbetrieb und Zeilen zeitweise Sperren, sowas wie ein "Edit-Flag". Gute Idee?            Zitieren

Hallo,

meine Software wird auf mehreren Arbeitsstationen betrieben. Zentral gibt es eine Datenbank.

Nun bereitet es mir etwas Kopfzerbrechen, wie ich den Mehrbenutzerzugriff ohne Inkonsistenzen in den Griff bekommen soll.

Zum Beispiel gibt es eine Kundenliste in der Datenbank. Wird ein bestimmter Kunde nun bearbeitet (was länger dauert) muss ich sicherstellen, dass der Eintrag währenddessen nicht von einer anderen Arbeitsstation gelöscht wird.

Es gibt etliche Tabellen mit z.B. Messergebnissen die alle Fremdschlüsselbeziehungen zum Kundeneintrag haben. Wird der gelöscht, geht alles schief.

Naja ein Edit-Flag wäre mir ab liebsten. Das schützt vor Löschungen an anderen Stationen. Nur was tun, wenn DIE Station abstürzt, die das Edit-Flag gesetzt hat? Dann wird die der Datensatz nie wieder freigegeben...


Eine Dienst auf dem Rechner mit der Datenbank kommt nicht in Frage: Die Clienten müssen sich irgendwie einig werden, und zwar OHNE Kommunikation untereinander. Die kennen nur den Datenbankserver.

Scheint mir kaum lösbar zu sein, oder?
witte
Mitglied

Benutzerprofil
Anmeldungsdatum: 08.01.2008
Beiträge: 1295
Beitrag witte Mitglied 18:36:02 11.03.2010   Titel:              Zitieren

Google doch mal nach Datenbank-Transaktionen, pessimistische und optimistische Sperrverfahren.
hustbaer
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.10.2006
Beiträge: 13509
Beitrag hustbaer Mitglied 23:25:48 11.03.2010   Titel:              Zitieren

Grob skizziert:

Daten holen, merken, anzeigen.

Edit geht auf extrige Kopie der Daten. Das kann dauern so lange will (ist ja nichtmal ne Transaktion offen während editiert wird).

Wenn User save klickt, dann Transaktion aufmachen, aktuelle Daten nochmal aus der DB holen, mit den gemerkten "Originalen" vergleichen.
Wenn ungleich dann ROLLBACK + User fragen was tun soll.
Wenn gleich dann mit der editierten Kopie überschreiben und COMMIT.

p.S.: das Locking der DB würde ich ganz sicher *nicht* für sowas verwenden wollen. Nicht weil ich dem nicht vertraue, sondern weil du dadurch etwas blockierst, was du nicht blockieren solltest. Nämlich dass man mit dem System arbeiten kann.

Im Prinzip ist das das selbe, was Systeme wie Subversion machen. Also Edit/Merge/Commit.

_________________
"Let there be Licht..." http://lichttools.sourceforge.net/
Sehr cooles ASCII Spiel (leider nicht von mir): ASCII-Scramble - http://www.roskakori.at/ascii/


Zuletzt bearbeitet von hustbaer am 23:28:11 11.03.2010, insgesamt 1-mal bearbeitet
UndEsIstSommer...
Unregistrierter




Beitrag UndEsIstSommer... Unregistrierter 11:16:45 12.03.2010   Titel:              Zitieren

@hustbaer:
Ich habe etliche Tabellen die mit Fremdschlüsseln auf den Kundensatz zeigen + externe Daten (Bilder).
Nur den Kundeneintrag zu kopieren reicht also nicht, es müsste alles irgendwo temporär gespeichert werden solange die "Sitzung" mit dem Kunden läuft. Und später alles vergleichen, das ist ja die Hölle. Meinst Du das echt so?

"Nicht weil ich dem nicht vertraue, sondern weil du dadurch etwas blockierst, was du nicht blockieren solltest"
Eigentlich schon, es wird der eine Kundensatz gesperrt. Alle anderen können an parallelen Stationen bearbeitet werden.
-=]xXx[=-
Mitglied

Benutzerprofil
Anmeldungsdatum: 15.04.2003
Beiträge: 456
Beitrag -=]xXx[=- Mitglied 13:23:17 12.03.2010   Titel:              Zitieren

Ich mache das so, das ich im Datensatz einen Sperrvermerk habe (User sind immer über Benutzername identifizierbar).
Wenn Jemand auf "Edit" in der Anwendung klickt mache ich erst ein Update auf den Sperrvermerkt:
"UPDATE table SET sperre='username' WHERE sperre='' AND id=0815;"
Wenn mir die DB zurückliefert, das ein Datensatz geändert wurde, hab ich mir den Datensatz erfolgreich reserviert, sonst war jemand anderes schneller.
Beim speichern oder abbrechen lösche ich die Sperre wieder, wenn mein Benutzername drin steht.

Problem:
Semmelt die Anwendung ab, bleiben gesperrte leichen über. Da gibts ne möglichkeit diese nachträglich freizugeben.


mfg
xXx

_________________
Wer nichts macht, macht auch nichts falsch!
hustbaer
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.10.2006
Beiträge: 13509
Beitrag hustbaer Mitglied 16:32:25 12.03.2010   Titel:              Zitieren

UndEsIstSommer... schrieb:
@hustbaer:
Ich habe etliche Tabellen die mit Fremdschlüsseln auf den Kundensatz zeigen + externe Daten (Bilder).
Nur den Kundeneintrag zu kopieren reicht also nicht, es müsste alles irgendwo temporär gespeichert werden solange die "Sitzung" mit dem Kunden läuft. Und später alles vergleichen, das ist ja die Hölle. Meinst Du das echt so?

"Nicht weil ich dem nicht vertraue, sondern weil du dadurch etwas blockierst, was du nicht blockieren solltest"
Eigentlich schon, es wird der eine Kundensatz gesperrt. Alle anderen können an parallelen Stationen bearbeitet werden.

Ja ich meinte das echt so. Da wusste ich noch nicht dass es sich um so grosse Daten handelt.
Es gibt aber auch so schöne "change indicator"/"change counter" Datentypen, die dir der SQL Server automatisch ändert/hochzählt, wenn irgendwas in der Zeile modifiziert wird.
Kann man auch verwenden um festzustellen ob es Edits dazwischen gab.

_________________
"Let there be Licht..." http://lichttools.sourceforge.net/
Sehr cooles ASCII Spiel (leider nicht von mir): ASCII-Scramble - http://www.roskakori.at/ascii/
Cpp_Junky
Mitglied

Benutzerprofil
Anmeldungsdatum: 08.08.2000
Beiträge: 3918
Beitrag Cpp_Junky Mitglied 11:08:46 15.03.2010   Titel:              Zitieren

Ich verwende für sowas optimistisches Locking und eine Hilfstabelle. In die kommt Username, Session ID, Tabelle und Primärkennung des Datensatzes. Wenn nun jemand anders versucht den Satz zu bearbeiten wird zunächst die Hilfstabelle abgefragt (Dabei die Session ID gecheckt um tote Sitzungen auszuschliessen) und ggf. eine Meldung ausgegeben "Wird gerade bearbeitet durch User Horst".
Diese Konstruktion ist ausschliesslich für das Frontend gedacht. Wenn Systemprozesse einen Konsistenzfehler verursachen, wird dies durch die Datenbank- und Session-Einstellungen gehandled, die vorher entsprechend konfiguriert wurden (Nowait ein, Iso Level auf Read Commited usw).
C/C++ Forum :: Datenbanken ::  Multiuserbetrieb und Zeilen zeitweise Sperren, sowas wie ein "Edit-Flag". Gute Idee?   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.