Ich verwende Java Hibernate.Was ist der Ansatz, um eine Zeile der Tabelle abhängig von Daten einer anderen Tabelle zu aktualisieren, wenn 2 Transaktionen gleichzeitig auftreten und sich gegenseitig beeinflussen
Usecase:
Ich habe 2 Tabellen: A und B Nun, wenn B enthält keine Zeile für eine Accid x mit Status wahr ist, dann Status Accid x in Tabelle A muss ACTIVE anderes es geändert werden sollte INAKTIV bleiben.
Aktueller Status der Tabellen A und B: B enthält 2 Zeilen (mit ID = 1, 2), die jeweils accId als X und Status True enthalten. A enthält 1 Zeile mit accId als X und Status INACTIVE.
Jetzt kommen 2 Aufrufe gleichzeitig, für jede der Zeilen (id = 1, 2) versuchen, den Status von accId X für die entsprechenden Zeilen als falsch zu machen.
Immer wenn ein Aufruf den Status accId false ergibt, mache ich in Tabelle B den Status false für die entsprechende Zeilen-ID und überprüfe in Tabelle B selbst, ob eine andere Zeile mit dem Status true für diese Konto-ID vorhanden ist. Wenn keine solche Zeile vorhanden ist, ändere ich den Status von accId in ACTIVE.
Nun, in meinem Fall, wenn 2 Anrufe zur gleichen Zeit kommen, beide prüfen, ob eine Zeile mit dem Status wahr oder nicht vorhanden ist, da die Transaktion nicht so weit festgeschrieben ist und im Speicher bleibt jeder von ihnen dort findet ist eine Zeile mit Status true noch vorhanden. Daher markieren beide ihren Status als falsch in der Tabelle für ihre jeweiligen Zeilen. Der Status von accId ändert sich jedoch nicht zu ACTIVE in Tabelle A.
So beheben Sie dieses Problem.
danke, ich habe versucht, mit pessimistischen lesen auf der Abfrageebene, aber nicht in der Lage, Wartezeit für die zweite Transaktion, daher LockAcquisitionException. – Talha