ORDA innerhalb einer Transaktion

Ich bin auf ein Problem mit ORDA gestoßen. Und zwar könnten dabei mehrere Datensätze in einem Prozeß gesperrt werden, wenn vorher eine Transaktion gestartet wird.

Ich habe eine kleines Beispielprogramm mitgeschickt. Wird die Methode „Test“ gestartet, wird eine Transaktion gestartet und dann ein Dialog mit einer Liste geöffnet. Mittels Doppelklick gelangt man in ein Eingabeformular. Hier kann nun für einen Kontakt den Hauptansprechpartner auswählen, ein kleines Script im Bestätigen-Button sorgt dafür, das nur ein Kontakt-Datensatz das Hauptansprechpartner-Flag gesetzt hat (so eine Art gegenseitige Verriegelung).

Wenn man jetzt mal den Hauptansprechpartner von 2 Kontakten hin und her wechselt, haben plötzlich 2 Kontakte dieses Attribut und man erhält die Fehlermeldung Datensatz gesperrt (lock - oder unlock – Status nicht successful).

Der ganze Vorgang funktioniert nur dann nicht richtig, wenn dieser innerhalb einer Transaktion läuft.

Getestet mit 4D v17.0 build 17.226481 unter Windows 10

http://forums.4d.com/4DBB_Main/x_User/6287532/files/25752729.zip

Hallo Herr Dr. Blaak :mrgreen:

wenn ein Datensatz innerhalb der Transaktion geändert wird, dann kann er nicht mehr entsperrt werden. So denke ich, ist das vorgesehen.

Deshalb gibt: $statusUnLock:=$vo_temp.unlock() auch success = false zurück, weil halt das entsperren nach dem save() nicht mehr möglich ist.

Genau so sieht es aus.
Wenn es also so gewollt ist… Also lautet die Antwort wohl: It´s not a bug, it´s a feature

Transaktionen blockieren alles - bis die Transaktion bestätigt oder abgebrochen wurde.
Das ist die wesentliche Idee einer Transaktion, in allen Datenbanksystemen.

Wäre eine vorzeitige Freigabe möglich, könnte ein anderer Prozess den Datensatz ändern.
Was ist dann, wenn die Transaktion abgebrochen werden soll, der vorherige Wert könnte doch nicht mehr zurückgesetzt werden!

Sie können nun argumentieren, das Sie einen Vorgang außerhalb/unabhängig der Transaktion durchführen wollen: dafür gibt es PAUSE/RESUME TRANSACTION.

Und deshalb, ja, es ist ein Feature, es nennt sich Transaktion. Ein wichtiges Feature. Alles wird bestätigt oder alles wird zurückgefahren, nicht “wir schauen mal was wir zurücksetzen können, der Rest ist Glückssache/Pech”.

Das hat aber nichts mit ORDA zu tun…

na ja, ich versuche ja nicht einen Datensatz innerhalb einer Transaktion von außerhalb zu modifizieren.
Sondern innerhalb einer Transaktion erst den einen Datensatz dann einen anderen und dann wieder den ersten.

ah, jetzt verstehe ich.

Es ist in Ihrem Fall eine Kombination.
Der Code sieht - so isoliert betrachtet - recht seltsam aus, ich nehme an er reduziert Ihre deutlich komplexere Umgebung und Sie haben nur einen Teilbereich, nämlich das wegnehmen des Flags, auf ORDA umgestellt, den Rest klassisch abgebildet.

In dieser Kombination schlägt es fehl, richtig. Und nein, ich denke nicht das es so gewollt ist. Ich meine ich würde nicht so programmieren, aber ich verstehe wie es historisch dazu kommt und sehe noch nicht warum das nicht gehen sollte. Muss ich noch weiter isolieren und analysieren. Ob es jetzt an der Listbox oder am ändern im Datensatz lliegt, klären wir.

Just for fun, beiliegend Ihre Anwendung komplett auf ORDA umgestellt, und dann geht auch die Änderung wie gewünscht.
Nochmal, mir ist klar das dies für Sie kein nutzbarer Weg ist, dies dient nur zur Info (ich erstellte es nur zum Test).
http://forums.4d.com/4DBB_Main/x_User/3985/files/25756120.zip

Ihr Weg sollte aber auch gehen. Wie gesagt, wir klären dies.

Ja, ich habe nur einen Teil der Programmierung in die Beispielsdatenbank übernommen.
Früher hatte ich das mit SQL Befehlen gemacht um die aktuelle Auswahl nicht zu zerschießen.
Das Beispiel bildet ein Teil einer Adressverwaltung ab. Es gibt Adressen, zu jeder Adresse “x” Ansprechpartner und nur einer der Ansprechpartner einer Adresse kann Hauptansprechpartner sein. Da die Adresseingabe in einer Transaktion läuft tritt das Problem wohl auf.

Danke für Ihre Mühe.

Die Lösung in Ihrer abgewandelten Version, ist ein interessanter Ansatz.
Ich habe mich noch nicht so viel mit ORDA auseinandergesetzt. Wir arbeiten zumeist noch mit 4D v16. Und gar nicht mehr auf die klassische Art 4D-Felder und Tabellen anzusprechen ist noch recht neu für mich.

Nochmals danke für die Meldung und Ihr Beispiel.
Fehler wird mit nächstem Release behoben.
Als Partner können Sie bei Bedarf Nightly Build nutzen, ab Build 226651 ist die Fehlerbehebung integriert.