Nhibernate: Warum stimmen Sitzungscache und Abfrageergebnisse nicht überein?
Posted: 06 Jan 2025, 07:05
Wir verwenden Nhibernate v4.0.30319 und wir verwenden Flushmode.Commit. Betrachten wir eine Beispiel-Employee-Tabelle mit der IsActive-Spalte in der Datenbank.
In einer der Transaktionen rufen wir den Employee mit empId = 100< ab /code> wie folgt:
Es ist noch nicht festgeschrieben und noch nicht einmal geleert.
Wir führen sofort die Abfrage aus, um alle aktiven Mitarbeiter abzurufen.
Jetzt erhalte ich im activeEmployees-Ergebnis immer noch die Mitarbeiterdetails von empId=100, aber mit dem IsActive-Wert als falsch.
Ich kann nicht verstehen, warum dieses inkonsistente Verhalten auftritt. Wenn die Abfrage in der Datenbank ausgeführt wird, sollte sie empId -100 mit dem IsActive-Wert „True“ zurückgeben. Wenn sie jedoch im Cache der ersten Ebene ausgeführt wird, sollte empId-100 nicht im Abfrageergebnis enthalten sein. Hier wird EmpId-100 mit IsActive false zurückgegeben.
Warum verhält es sich so? Ich habe einige Artikel und Konfigurationsdetails durchgesehen, kann dieses Verhalten jedoch nicht herausfinden.
In einer der Transaktionen rufen wir den Employee mit empId = 100< ab /code> wie folgt:
Code: Select all
var employee = session.Get(100);
employee.IsActive = false;
Wir führen sofort die Abfrage aus, um alle aktiven Mitarbeiter abzurufen.
Code: Select all
var activeEmployees = session.CreateCriteria()
.Add(Restrictions.Eq("IsActive", true))
.List();
Ich kann nicht verstehen, warum dieses inkonsistente Verhalten auftritt. Wenn die Abfrage in der Datenbank ausgeführt wird, sollte sie empId -100 mit dem IsActive-Wert „True“ zurückgeben. Wenn sie jedoch im Cache der ersten Ebene ausgeführt wird, sollte empId-100 nicht im Abfrageergebnis enthalten sein. Hier wird EmpId-100 mit IsActive false zurückgegeben.
Warum verhält es sich so? Ich habe einige Artikel und Konfigurationsdetails durchgesehen, kann dieses Verhalten jedoch nicht herausfinden.