Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Stored procedure thread-safe (https://www.delphipraxis.net/60558-stored-procedure-thread-safe.html)

Der Jan 9. Jan 2006 09:48

Datenbank: Firebird • Version: 1.5 • Zugriff über: -

Stored procedure thread-safe
 
Hallo zusammen,

tja, wie der Titel sagt :) Mich würde interessieren, ob SPs unter FB thread-safe sind. Also im Prinzip so: Ein User ruft eine SP auf, ein anderer ruft die selbe SP auf, bevor die erste abgearbeitet ist. Wird jetzt die erste erst fertig abgearbeitet oder gibt es hier auch eine Art Multi-Threading? Hab zwar schon die FB-Refetenz gewälzt, aber nix passendes gefunden.

mkinzler 9. Jan 2006 10:03

Re: Stored procedure thread-safe
 
Sollte schon sein, da für jeder Datenbankverbindung beim Superserver (Windows) auf Serverseite ein eigener Thread verwendet wird. Beim Classic Server (Linux) wird sogar ein eigener Proccess verwendet.

Der Jan 9. Jan 2006 10:16

Re: Stored procedure thread-safe
 
War vielleicht bissel unglücklich formuliert... Aber wenn jede Connection ihren eigenen Thread hat, dann kann es doch sein, das die Abarbeitung von Thread1/SP unterbrochen wird und die SP in Thread2 abgearbeitet wird? Vielleicht steht auch nur gerade jemand auf meiner Leitung und ich verstehs einfach nicht :stupid:

Lemmy 9. Jan 2006 10:37

Re: Stored procedure thread-safe
 
Hi,

wenn SP1 abgebrochen wird, kann doch SP2 ohne Probleme weiter laufen, denn beide sind innerhalb einer Transaktion und kommen sich daher erst mal nicht in die Quere. Erst wenn beide auf denselben Datensatz zugreifen kann es "kritisch" werden, da dann evtl. ein Deadlockfehler (je nach Transaktionsparameter) kommt. Die Daten werden in jedem Fall nicht beschädigt!

Lemmy

Der Jan 9. Jan 2006 10:58

Re: Stored procedure thread-safe
 
Zitat:

Zitat von Lemmy
Erst wenn beide auf denselben Datensatz zugreifen kann es "kritisch" werden, da dann evtl. ein Deadlockfehler (je nach Transaktionsparameter) kommt. Die Daten werden in jedem Fall nicht beschädigt!
Lemmy

Genau da liegt das Problem. Sie greifen auf den selben Datensatz zu. Die SP berechnet eine Auftragsnummer. Diese ist jedoch nicht einfach INT, sondern ein bissel komplizierter aufgebaut. Jetzt habe ich in einer Tabelle mehrere Variablen gespeichert. (Jaaa, ich weiß, ist nicht so die feine Art, aber bequem :) ) Unter anderem die letzte Auftragsnummer. Wird die SP aufgerufen, liest sie Nummer und errechnet daraus die nächste Nummer, speichert sie wieder und gibt die Nummer auch zurück. Wenn also die SP unterbrochen wird, könnte es zu Unstimmigkeiten kommen.. :(

mkinzler 9. Jan 2006 11:04

Re: Stored procedure thread-safe
 
Da unterscheidet sich eien SP nicht von einem normalen Query. Wenn die Transaktionseinstellungen nicht geradee auf dirty-read stehen., siht SP2 die Änderungen von SP1 nicht. Auf den selber Datensatz kann normalerweise nicht zugegriffen werden. ( SP2 wird normalerweise angehalten bis SP1 beendet ist). Das einzige Problem das ih sehe ist das es zu deadlocks kommen kann, wenn die Timeout-Einstellungen zu groß gewählt sind.

dataspider 9. Jan 2006 11:04

Re: Stored procedure thread-safe
 
Hi,

ich hole mir die Nummern auch immer über eine SP.
Das ganze wird in einer Wait Transaction gekapselt. Such mal nach LockWait oder so in der Transaction.

Cu, Frank

Quake 9. Jan 2006 11:16

Re: Stored procedure thread-safe
 
Habe ich das richtig verstanden, die liest den letzen Datensatz, schaust dir die letzte Auftragsnummer an und addierst dann eins drauf um die neue Auftragsnummer zu erhalten???

Der Jan 9. Jan 2006 11:23

Re: Stored procedure thread-safe
 
Zitat:

Zitat von Quake
Habe ich das richtig verstanden, die liest den letzen Datensatz, schaust dir die letzte Auftragsnummer an und addierst dann eins drauf um die neue Auftragsnummer zu erhalten???

Nein :) Wäre es so einfach, hätte ich das über Autozähler (Generator/Trigger, kennt man ja) gemacht. Die Berechnung ist nicht ganz so trivial.

Zitat:

Zitat von dataspider
Das ganze wird in einer Wait Transaction gekapselt. Such mal nach LockWait oder so in der Transaction.
Cu, Frank

Das werd ich mal tun


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz