AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Lock conflict obwohl die andere Transaction nicht mehr activ ist
Thema durchsuchen
Ansicht
Themen-Optionen

Lock conflict obwohl die andere Transaction nicht mehr activ ist

Ein Thema von MyRealName · begonnen am 17. Nov 2017 · letzter Beitrag vom 18. Nov 2017
Antwort Antwort
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
679 Beiträge
 
Delphi 10.4 Sydney
 
#1

Lock conflict obwohl die andere Transaction nicht mehr activ ist

  Alt 17. Nov 2017, 23:30
Datenbank: Firebird • Version: 3 • Zugriff über: UniDAC
Hallo,
ich habe ein seltsames Verhaltem welches ich im Moment nicht verstehe, vielleicht hat ja einer von Euch 'ne Idee..
Ich nutze Unidac ohne Autocommit in der UniConnection, mache also explizites Transaction handling.
Nun will ich für ein paar Stellen von einer Arbeitsqueue auf ein direktes sofortiges Bearbeiten umstellen.

Kurze Erklärung hierzu : Wenn ich eine Rechnung mache, muss ich nachsehen, ob die physischen Einheiten auch im Inventar vorhanen sind. Dazu gibt es eine Tabelle mit dem aktuellen Stand pro Location (Tabelle heisst ITEMDET) die von der Bewgungstabelle (ITEMACT) über einen trigger geupdated wird. Machen ich 2 Rechungen und vllt noch einen Wareneingang über das gleiche produkt in derselben Location, dann führt das zu lock conflicts machmal. Deswegen habe ich eine Arbeits queue, wo diedokumente speichern und anstelle die Bewegungen selbst zu schreiben, senden sie es an die Queue, die es dann zentralisiert macht und dann immer nur 1 Dokument durchlässt, so kommt es nie zum lock conflict. Allerdings kann es manchmal ein paar Sekunden dauern, bis das Dokument bearbeitet wurde und da kommt es dann zu Löchern wo die Produkte noch verfügbar sind obwohl schon verkauft.

Dazu will ich dann bestimmte Abgänge (Verkäufe und Verschiebungen von einer zur anderen Location) direkt mit einer Wait transaction machen, während Eingänge und zeit-unkritische dokumente weiterhin über die Queue laufen.

Nun das Problem (mit UniDAC) :

ich mache ein update auf ein Register in itemdet und lasse die transaktion "1" offen, dann hält meine wait transaction "2" auch schön an und wartet. Mache ich Commit auf Transaktion "1", dann kommt die "2" mit dem lock conflict zurück. Nicht was ich erwartet habe, dachte eigenetlich, dass sie jetzt ihre daten schreibt, aber gut, ist halt so. Ich mache also ein RollbackRetaining (weil rollback mir alle offenen Queries und Tabllen auf dem Formular schliesst) und dann starte ich das schreiben neu, kriege aber immer noch den lock conflict. In MON$TRANSACTIONS gibt es die Transaction aber schon garnicht mehr..

Ideen ? was mache ich falsch, wo habe ich einen Denk Fehler ?

EDIT: habe gerade probiert mein absolutes Ergebnis (UPDATE ItemDet SET ONHAND=:Qty WHERE Id=:ID) durch ein Delta-update zu ersetzen (UPDATE ItemDet SET ONHAND=Onhand + elta_Qty WHERE Id=:ID ). Damit er nach dem lock conflict dann den neuen Wert nutzen kann. Aber das hat auch nicht geholfen

Geändert von MyRealName (18. Nov 2017 um 02:07 Uhr)
  Mit Zitat antworten Zitat
hstreicher

Registriert seit: 21. Nov 2009
221 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Lock conflict obwohl die andere Transaction nicht mehr activ ist

  Alt 18. Nov 2017, 15:51
das Problem dürfte das RollbackRetaining sein
da der Transaction erhalten bleibt


Von Devart:
procedure RollbackRetaining;
Call the RollbackRetaining method to roll back all changes of data associated with the default database transaction to the database server and then retain the transaction context.

mfg Hannes
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
679 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Lock conflict obwohl die andere Transaction nicht mehr activ ist

  Alt 18. Nov 2017, 20:22
Das ist auch mein Gedanke.

ich habe es mal auf eine Transaktion umgebaut, die extra nur für das Schreiben in diesem Abschnitt da ist. Das heisst ich mache erst ein explizites StartTransaction und in einem try...Except Block Commit oder Rollback, also nichts Retaining.

Aber jetzt habe das folgende Problem :

Obwohl ich ein explizites Rollback und ein neues StartTransaction mache, scheint die Datenbank die Indices schon geupdated zu haben und behauptet felsenfest, dass das Document mit dieser Id schon existiert und ich den index oder den primary key verletze. Mache ich aber in eine console ein select auf die Tabellen dann ist da nichts.

Ist das ein bug von firebird ? oder UniDAC ? Kennt das jemand ?
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
679 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Lock conflict obwohl die andere Transaction nicht mehr activ ist

  Alt 18. Nov 2017, 22:57
OK, Fehler gefunden, beim Frameworkumbau einen default Wert gelöscht und der wurde dann doch noch benutzt und der hat mir das Query zur falschen Transaction zugewiesen.

Mit Rollback und Commit geht alles.
  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 04:19 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