Kundenverwaltung Datenbankproblem!

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo! Programmiere gerade eine Kundenverwaltung mit mysql datenbank! Es soll möglich sein mit mehreren clients zu arbeiten.

Stehe jetzt vor einem kleinen problem! Und zwar, wenn ich einen bestehenden Kunden aus einer Kombobox auswähle werden die Daten aus der Datenbank ausgelesen und in die vorgesehenen Textfleder geschrieben! Jetzt möchte ich, dass niemand veränderungen an diesem Kunden vornehmen kann, sobald er von einem Client geöfnet wurde. Dafür habe ich in der Datenbank eine eigenes Feld (Lock) vorgesehen, dass ich einfach von 0 auf 1 setze.
Wenn die änderung am Kunden abgeschlossen sind wird dieses Feld einfach wieder auf 0 zurückgesetzt!

Jetzt stehe ich aber vor folgendem Problem und zwar, wenn ich das Lock auf 1 setze und meine Datenbank aus unerklärlichen gründen abstürzt bleibt dieser Kunde in der Datenbank locked und ich kann ihn ja nie mehr ändern!

Gibts da irgend eine Möglichkeit das zu umgehen? Hab schon was von commit und rollback gelesen, bin mir aber nicht sicher ob mir das weiterhilft?

Danke für eure hilfe!
 

ARadauer

Top Contributor
ausserdem musst du nicht 0 oder 1 rein schreiben, du kannst auch einen zeitstempel rein geben.

ich hatte mal sowas, ich hab zusätzlihc noch den aktuellen benutzer vermerkt.

man durfe den datensatz bearbeiten, wenn der zeistempel älter als 30 minuten war. der aktuelle zeitstempel und der benutzername wurde gesetzt.
wenn man speichern wollte wurde vorher überprüft ob nicht schon ein anderer benuter, sich nach 30 minuten den datensatz geschnappt hat.

hat eigentlich produktiv mit ca 100 Benutzer super funktioniert. wenn man 30 Minuten nichts mit dem Datensatz macht, und ein anderer kommt daher und fängt zu Bearbeiten an, war man selber schuld.

Transaktionen sind natürlich auch eine Möglichkeit, habe ich aber in der hinsicht noch nie verwendet.
 
G

Guest

Gast
Danke für eure Antworten!

Habe nur noch eine Frage zu den Transaktionen! Kann mir irgendwie nicht vorstellen wie ich das in meinem Fall einsetzen kann bei folgendem Szenario!

Benutzer wird aus combobox geladen und Textfelder werden befüllt! Jetzt wird auch automatisch überprüft ob dieser Benutzer gelockt ist oder nicht!

1) Hier müsste jetzt meine Transaction beginnen
Wenn nicht, wird ein Lock gesetzt indem in der Datenbank KLock von 0 auf 1 gesetzt wird!

Kunde wird modifiziert. Danach wird der Kunde mittels eines buttons neu gespeichert. Lock wird wieder auf 0 zurückgesetz!

2) Hier müsste meine Transaction enden!

Wie ich das mit den transactions richtig verstehe werden jetzt einfach alle datenbankänderungen erst am Ende durchgeführt! D. H. wenn ich meinen Kunden lade, das Lock auf 1 setze und danach die Datenbanverbindung stirbt, passiert direkt in der Datenbank nichts, oder?

Falls das der Fall sein sollte, was mache ich dann aber, wenn zufällig 2 Benutzer kurz hintereinander den selben Kunden laden? Dann ist ja das Lock zwar in meiner Transaction gesetzt, aber in der Datenbank noch nicht, deshalb darf dann der 2e Benutzer auch änderungen durchführen, oder?

Habe ich das richtig verstanden, weil dann hilft mir ja das mit den Transactions nur insofern weiter, dass einfach alle Transactionen am ende hintereinander durchgeführt werden und ich damit sicherstelllen kann, dass meine Datenbankverbindung dazwischen nicht stirbt?

Danke!
 
S

SlaterB

Gast
ja das System ist hier dann, dass die Transaktion 1 einen internen Schreib(b)lock auf Block-Feld bekommt,
quasi doppelt gemoppelt,

Transaktion 2 würde ja auch gerne auf das fragliche Feld 1 schreiben,
muss dann aber warten, bis Transaktion 2 fertig ist

daher könntest du dir eigentlich das Lock-Feld sparen und direkt auf den Datensatz schreiben,
niemand sonst kann während der Transaktion darauf schreiben,
wenn alles korrekt abläuft,

-----

ein reines Lesen ohne Schreiben in der gleichen Transaktion wird damit normalerweise nicht verhindert,

wenn irgendjemand ein Transaktion offen hat und einen Datensaz ändert,
dann kann eine zweite Transaktion den alten Datensatz lesen ohne zu erfahren, dass jemand darauf schreibt

möglich ist das aber auch das, mit der höchsten Transaktionssture Serializable (evtl. auch etwas darunter,
dann würde die zweite Transaktion solange blockiert werden,
 
G

Guest

Gast
Praktisch heisst dass dann, dass wenn ich mit Transaktionen arbeite, einfach der gesamte Datensatz in der Datenbank gesperrt wird, und keiner anderer Client mehr drauf zugreifen kann, oder?
 
S

SlaterB

Gast
wie gesagt geht einfaches Lesen durchaus noch, falls nicht verboten, was standardmäßig nicht der Fall sein sollte,
aber theoretisch über unbekannte Einstellungen zu philosophieren ist auch nicht schlau,
im Zweifel testen
 

ARadauer

Top Contributor
wie sieht sowas praktisch in jdbc code aus?

so nicht oder?
Code:
con.setAutoCommit(false);
//laden
//verarbeiten
//speichern
con.commit();
con.setAutoCommit(true);

...bei Fehler: con.rollback();

bringt mir das die Funktionalität, bzw sperrt mir das die Zeilen?
 

DP

Top Contributor
ARadauer hat gesagt.:
ausserdem musst du nicht 0 oder 1 rein schreiben, du kannst auch einen zeitstempel rein geben.

alles relativ. was machst du wenn sachbearbeiter a den kunden als reminder aufruft und dann in mittagspause geht?

das mit dem locked und nicht locked ist schon okay. du bekommst ja schliesslich auch nicht mit wenn z.b. der user den browser zu macht. dann bleibt der satz auch locked.

bastel dir noch ne ansicht wo die user sehen welche kundensätze von ihnen in bearbeitung sind und dann können sie diese selbst wieder freigeben...

habe ähnliches und bei ungeklärten fällen bleiben schon einige sätze wochenlang locked.
 
G

Guest

Gast
Hi!

Habe mich jetzt trotzdem für die Variante mit der Timestamp entschieden! Jetzt möchte ich mit dem Timestamp rechnen, weiß aber leider nicht wie das geht!

Habe jetzt meinen Timestamp in der Datenbank gespeichert und berechne mir beim Aufruf einfach den Aktuellen Timestamp. Jetzt möchte ich vom aktuellen Timestamp einfach -24 Stunden rechnen und dann die beiden Timestamps vergleichen! Wie führe ich diese Berechnung durch?

Danke!
 
S

SlaterB

Gast
aus Timestamp ein Calendar machen, dort gibts add-Operationen,

schau dir erstmal das Kapitel Date/ Calendar in einem Lehrbuch an
 
G

Guest

Gast
Gibts da keine einfacheren Möglichkeiten! Muss ja nicht genau 1en Tag gesperrt werden! Ideal wäre eine beschränkung auf ein paar Stunden. Gibts keine Möglichkeit zu der jetzigen Zeit im Timestamp objekt (z. B. 12 Stunden) abzuziehen und dann einfach mit dem Timestamp objekt aus der Datenbank zu vergleichen?

Danke für eure Hilfe
 
S

SlaterB

Gast
> Gibts keine Möglichkeit zu der jetzigen Zeit im Timestamp objekt (z. B. 12 Stunden) abzuziehen

doch, siehe vorheriges Post, ist einfach ;)
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben