MySQL paralleler zugriff

01/08/2018 20:41 SCORNI#1
Heyo,

ich konnte mich nicht ganz zwischen Web Development und General Coding entscheiden, falls ich hier falsch bin bitte verschieben :)

Und zwar habe ich ein theoretisches Problem welches ich nicht selber recherchieren konnte auf Grund fehlender Suchbegriffe.

Ich habe eine mysql Tabelle mit einem Pool an Werten, die zweite Spalte gibt an, wem dieser Wert zugeordnet ist. Ist die zweite Spalte = null, so ist dieser Wert noch nicht zugeordnet und kann noch vergeben werden.

Nun habe ich zwei SQL Verbindungen die zu genau dem gleichen Zeitpunkt eine Query abschicken um einen freien Wert aus dem Pool zu nehmen und diesen zuzuordnen.
Als Beispiel wird das ganze mit zwei Querys pro Verbindung umgesetzt

Query 1: Liefere mir einen freien Wert
Query 2: Ordne xy dem Wert zu

Im optimalfall läuft das so:

ZeitpunktAktion
t0Verbindung 1 fordert freien Wert aus Wertepool
t1Verbindung 1 erhält ID von freiem Wert (z.B. 10)
t2Verbindung 1 führt update statement auf ID 10 aus und ordnet den Wert zu Verbindung 1 zu
t0Verbindung 2 fordert freien Wert aus Wertepool
t1Verbindung 2 erhält ID von freiem Wert (z.B. 11)
t2Verbindung 2 führt update statement auf ID 11 aus und ordnet den Wert zu Verbindung 2 zu

Was aber, wenn der Scheduler ungünstig zwischen den Threads switcht und das ganze dann so aussieht:

ZeitpunktAktion
t0Verbindung 1 fordert freien Wert aus Wertepool
t1Verbindung 1 erhält ID von freiem Wert (z.B. 10)
t2Verbindung 2 fordert freien Wert aus Wertepool
t3Verbindung 2 erhält ebenfalls freie ID 10, da noch keine Zuweisung von Verbindung 1 stattgefunden hat
t4Verbindung 1 führt update statement auf ID 10 aus und ordnet den Wert zu Verbindung 1 zu
t5Verbindung 2 führt update statement auf ID 10 aus und ordnet den Wert zu Verbindung 2 zu

Ende vom Lied wäre ein Überschreiben der Zuweisung für Verbindung 1 und somit ein kritischer Fehler

Falls sich hier jemand mit thread sicheren DB programmen auskennt wäre ich über Hilfe sehr dankbar.
Normal würde man ja sowas mit semaphoren/mutexen umsetzen aber bei DB Operationen bin ich bei sowas echt ratlos...
01/08/2018 21:04 Serraniel#2
Schau dir mal Transactions an: [Only registered and activated users can see links. Click Here To Register...]
01/08/2018 21:07 florian0#3
Was du suchst sind "Transaktionen". Speziell "Locking Reads" mit "FOR UPDATE"

[Only registered and activated users can see links. Click Here To Register...]
01/08/2018 21:17 SCORNI#4
Perfekt, danke euch beiden. Genau das hab ich gesucht!
Scheint garnicht so schwer zu sein wenn man weiß wonach man suchen muss :)
01/09/2018 01:21 florian0#5
Quote:
Originally Posted by SCORNI View Post
Scheint garnicht so schwer zu sein wenn man weiß wonach man suchen muss :)
Ist das nicht immer so wenn man was nicht findet ;D


Du kannst das Ganze natürlich auch mit Lock/Semaphore/Mutex in deiner Anwendung lösen. Dann tritt das Problem aber spätestens wieder auf, wenn du deine Anwendung 2x startest.