AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Stress mit UniDac

Ein Thema von normancz · begonnen am 30. Nov 2011 · letzter Beitrag vom 30. Nov 2011
Antwort Antwort
normancz

Registriert seit: 28. Mär 2008
6 Beiträge
 
Delphi 2010 Professional
 
#1

Stress mit UniDac

  Alt 30. Nov 2011, 09:23
Datenbank: Firebird • Version: 2.5 • Zugriff über: UniDac
Hallo,
ich versuche gerade einen Umstieg von DBExpress nach UniDac. Dabei sind mir allerdings zwei Eigenarten von UniDac begegnet, welche mich doch an der Komponente zweifeln lassen:

a) Beim Prepare einer Query wird eine interne Transaktion gestartet.

Bis jetzt habe ich es immer so gemacht, dass ich beim Erzeugen von DBExpress TSQLDataset-Instancen in meinen Model/OPF-Klassen sofort das SQL-Kommando zuweise und dann die Query prepariere. Beim Schreiben in der DB wird dann ggfs. manuell eine Transaktion verwendet. Nun musste ich beim Wechsel nach TUniSQL feststellen, dass bei einem Rollback die Änderungen nicht zurückgenommen wurden.

Nach stundenlangen Suchen bin ich dann dahinter gekommen, dass durch ein Prepare schon eine interne Transaktion gestartet wird, und daher keinen Bezug zur manuellen Transaktion mehr hat. Als ich dann TUniConnection und TUniSQL ein Transaktionsobjekt zugewiesen habe, da wurde bei StartTransaction auch schon gleich gemeckert dass schon eine Transaktion aktiv ist.

Nun gut, das Problem kann ich durch entfernen der Prepare Aufrufe lösen und hoffen dass ich nichts vergessen habe was beim Kunden mit wackligen Netzwerk dann durch ein Server-Rollback die Arbeit von Stunden vernichtet. Nur fragte ich mich, warum bei UniDac eine interne Transaktion nötig ist, und DBExpress komischerweise mit dem verwendeten DevArt Firebird-Treiber ohne diese auskommt.


b) RowsAffected von TUniSQL liefert immer 0 zurück

Bei einer TUniSQL Komponente mit einem einfachen Update-Kommando auf eine existierende ID liefert RowsAffected einfach 0. Beim Suchen im DevArt-Forum bin ich bei einem alten Post von 2009 fündig geworden: die Query muss dazu prepariert sein. Das kann ich reproduzieren, aber damit habe ich wieder das Problem von a) am Hals.

Also muss ich TUniQuery verwenden (welche das Problem nicht hat), oder bei jeder RowsAffected-Abfrage den Execute-Teil in eine manuelle Transaktion einbettten sofern nicht schon eine aktiv ist (schwierig da ich für DBExpress/UniDac einen Wrapper verwende welches dies in der Execute-Methode als Rückgabewert liefert).


Daher mal die Frage: gibt es sonst noch irgendwelche Fallen bei UniDac? Oder mache ich einfach irgendwas falsch?

Sie scheinen ja schon gut zu sein. Aber sie haben mich halt schon Stunden für die Fehlersuche an ganz falschen Stellen gekostet, da ich z.B. Transaktionen bis jetzt immer unter "funktioniert einfach" verbucht, und daher in Unittests nicht weiter berücksichtigt habe. In der Doku zu Prepare/Prepared steht natürlich nichts zu der Besonderheit und auch für den Fall b) gibt es keinen Hinweis. Gerade hier ärgert mich einfach dass RowsAffected dann nicht einfach -1 zurückliefert oder meinentwegen eine Exception auslöst und mir damit einen halben Tag Fehlersuche gespart hätte.

Bye,
Norman
  Mit Zitat antworten Zitat
Benutzerbild von mikhal
mikhal

Registriert seit: 11. Sep 2003
Ort: Linz am Rhein
796 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Stress mit UniDac

  Alt 30. Nov 2011, 10:02
Zu deinem Problem mit Transaktionen: Ich verwende immer zwei Transaktionsobjekte (TUniTransaction) pro Form, die ich dann den Properties Transaction und UpdateTransaction der Queries zuweise. Danach habe ich dann keine Probleme mehr mit Transaktionen.

Dein Problem mit Prepare ist eher Firebird geschuldet, da dort grundsätzlich alles in einem Transaktionsrahmen abläuft, die ggf. automatisch vom System gesetzt wird, auf die du dann keinen Zugriff mehr hast.

Grüße
Mikhal

PS: Dein Problem hatte ich bereits bei IBDAC, und konnte es nur wie oben geschildert auflösen.
Michael Kraemer
Computer erleichtern die Arbeit...
...und die Erde ist eine Scheibe!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:32 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