Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Transaktionsprobleme, bei konkur. Updates bleibt Programm hä (https://www.delphipraxis.net/139698-transaktionsprobleme-bei-konkur-updates-bleibt-programm-hae.html)

Darkmorph 3. Sep 2009 10:37

Datenbank: Firebird • Version: 1.5 • Zugriff über: Delphi Express

Transaktionsprobleme, bei konkur. Updates bleibt Programm hä
 
Hi,
ich hab folgendes Problem. Wenn ich einen Datensatz ändere und diese Transaktion offen lasse und dann eine zweite instanz von meinem Programm darauf zugreift, um diesen auch zu ändern, bleibt die 2. Instanz erst hängen ohne auslastung und wenn meine erste Instanz commited, produziert die 2. Instanz 100% Last.

SQL-Code:
SqlConnection.ExecuteDirect('Update personal set vorname="JÖRG SQLCON1" where id=14438');
Bei der Zeile
Delphi-Quellcode:
Status := Command.executeImmediate(PChar(SQL), Cursor);
bleibt der obige Aufruf dann hängen. Dieser scheint in der DbExpint.dll dann zu liegen.

Es muß aber auch anders gehen, da wenn ich z. B. mit IBExpert als 2. Instanz auf den Datensatz gehe und diesen ändern und commiten will, bringt dieser sofort die Meldung Datensatz blockiert.
Zitat:

"lock conflict on no wait transaction.
deadlock.
update conflicts with concurrent update."
Zitat:

SQLCONNECTION ist mit folgenden Parametern gefüttert:
BlobSize=-1
CommitRetain=False //True or False macht keinen Unterschied
Database=127.0.0.1/3050:C:\database.ibf
DriverName=Interbase
ErrorResourceFile=
LocaleCode=0000
Password=masterkey
RoleName=RoleName
ServerCharSet=win1252
SQLDialect=1
Interbase TransIsolation=ReadCommited
User_Name=sysdba
WaitOnLocks=false //True or False macht keinen Unterschied
Wieso kriege ich bei meinem Programm nicht auch eine Exception, wie sie offenbar bei IBExpert geworfen wird?
Falls Ihr Probleme habt meinen Wirren Gedanken zu folgen, bitte einfach nachfragen. An der Lösung wäre ich echt brennend interessiert.

Vielen Dank für eure Mühen,

Gruß
Benjamin

Darkmorph 3. Sep 2009 12:09

Re: Transaktionsprobleme, bei konkur. Updates bleibt Program
 
Durch Stunden der Recherche hab ich ermitteln können, dass andere Komponenten eine Property Namens "NoWait" bieten, welche wenn es zu beschriebener Situation eine abfangbare Expception auslöst. Es würde mir schon helfen, wenn ich wüßte, wie man diese über die TSQLConnection setzen kann. Einfaches einfügen in die Params geht leider nicht, hab das in meiner Verzweiflung schon versucht...

Update:
Hab das Szenario mit IBDataBase und IBSQL + IBTransaktion nachgestellt, dort wird die gewünschte Exception geschmissen, wenn im IBTransaktion das Setting NOWAIT gesetzt ist. Wie bekomme ich dbExpress dazu, Firebird mitzuteilen genauso zu handeln?

hoika 3. Sep 2009 14:21

Re: Transaktionsprobleme, bei konkur. Updates bleibt Program
 
Hallo,

aso es sollte gehen, siehe hier
1

Hast du vielleicht false statt False geschrieben ?


Heiko

Darkmorph 3. Sep 2009 16:16

Re: Transaktionsprobleme, bei konkur. Updates bleibt Program
 
Zitat:

Zitat von hoika
Hallo,
Hast du vielleicht false statt False geschrieben ?
Heiko

Hier die Stelle wo DBExpress diese Option ausliest, du siehst, er uppercased es und nur wenn True steht passiert was. D. h. ich könnte "nö" schreiben und er würde es auch als False interpretieren :)
FISQLConnection.SetOption(eConnWaitOnLocks, LongInt(UpperCase(trim(FParams.Values[WAITONLOCKS_KEY])) = 'TRUE'));

Also anders als im Artikel gesagt, funktioniert WaitOnLocks leider garnicht bei mir. Was ich bräuchte wäre, wie es die IBTransaction-Komponente bietet, ist die Möglichkeit NOWAIT für eine Transaktion zu definieren, so daß ich sofort eine Fehlermeldung bekomme. Die Erste Antwort im deinem Artikel spricht von einer 2. Option "Not Wait" aber wie man diese zum Laufen bringt, verät der Autor leider nicht:
Zitat:

If you long transactions
wait, your app will appears to hang when this occurs. Naturally, the
second option is to not wait. This means when an update conflict occurs
you get an error immediately.
Der andere Lösungsansatz mit der LockTable würde zu viel Aufwand und Unwägbarkeiten für mein Projekt bedeuteten. Und davon abgesehen halte ich es für unsinnig FirebirdsLockTable nochmal für meine App zu programmieren.

Falls euch noch andere Wege einfallen, wäre ich auch weiterhin sehr dankbar für Input :)

Vielen Dank Hoika für die schnelle Hilfe,

Grüße Benjamin

hoika 3. Sep 2009 19:11

Re: Transaktionsprobleme, bei konkur. Updates bleibt Program
 
Hallo,

könnte auch nen Bug sein,
versuch doch mal die neueste Version von DBExpress zu laden.



Heiko

Darkmorph 4. Sep 2009 11:06

Re: Transaktionsprobleme, bei konkur. Updates bleibt Program
 
Hi Hoika,

auf die Idee war ich auch schon gekommen, aber wie und wo für delphi 6? Von Embarcardo gabs nur das Update zu Interbase 6.5, welches eine ältere DLL mitlieferte, als ich im Einsatz hatte. Ich hab spasseshalber mal den dbExpress Interbase-Treiber von DevART ausprobiert ("DevartInterBase"). Voila, auch mit der originalen TSQLConnection funktioniert alles Prima, ich kriege sofort die Meldung Lock Conflickt. D. h. meine DBExpInt.dll (also der Interbase-Treiber der mit Delphi mit kommt D6) ist zu alt oder buggy. Bekomme ich irgendwo einen neuen? D7 funzt leider nicht 100% aber wirft wenigstens 'ne accessviolation bei Lock conflict.

Gruß Ben

hoika 4. Sep 2009 11:17

Re: Transaktionsprobleme, bei konkur. Updates bleibt Program
 
Hallo,

meinest du den ?
D6 DBExpress

Wieder ein Grund, weg von DBExpress ...
oder halt D2010 (native Firebird Treiber)


Heiko

Darkmorph 4. Sep 2009 12:12

Re: Transaktionsprobleme, bei konkur. Updates bleibt Program
 
Hi Hoika,
glaub mir, wenn ich könnte würde ich sofort switchen. Aber mein Projekt ist mittlerweile so umfangreich, daß eine Portierung zu den IBComponenten oder D2010 zu aufwendig wäre. Es darf nicht war sein, aber am Ende wird mir wohl doch nichts anderes übrig bleiben, als einen eigenen Lock-Mechanismuß zu proggen, weil dbExpint buggy ist.

Ich hoffe immer noch auf einen Fingerzeig auf eine Möglichkeit diese Sache einfacher zu lösen, aber werde mir schon einmal parallel Gedanken zum Locking machen...


Gruß
Benjamin

hoika 4. Sep 2009 13:01

Re: Transaktionsprobleme, bei konkur. Updates bleibt Program
 
Hallo,

war denn mein Link der zu der Version, die du schon hast ?


Heiko

Darkmorph 4. Sep 2009 16:04

Re: Transaktionsprobleme, bei konkur. Updates bleibt Program
 
nein, zu einer noch älteren Version. Vor der DbExpint.dll V7 wurden ja leider keine Versionsinformationen in die DLL eingetragen, aber am Timestamp konnte ich erkennen, daß meine paar Monate jünger war, als die zu dem Update von dir....

Gruß
Benjamin


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:30 Uhr.

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