2 Stimmen

Sichtbarkeit von Aussagen in einer transaktionsbezogenen Ansicht?

Ich habe eine Frage zur Sichtbarkeit von Daten in Datenbankansichten. Ich verwende Oracle. Ich habe eine Tabelle myscheme.users und eine Tabelle global.users (myscheme und global sind Schemata) Im globalen Schema gibt es eine Ansicht "globalusers", die beide Benutzertabellen zusammenfasst.

Ich habe eine Java-Anwendung, die einen neuen Benutzer in der Tabelle myscheme.users einfügt. Danach wird eine Abfrage für den neuen Benutzer in der globalusers-Ansicht durchgeführt, um den neu erstellten Benutzer zu laden. All dies geschieht innerhalb der gleichen Transaktion. Meine Frage ist nun, warum ist der neu erstellte Benutzer in der Tabelle myscheme.users sichtbar, aber nicht in der globalusers-Ansicht? Wenn die Transaktion geschlossen wurde, ist der Benutzer auch in der Globaluser-Ansicht zu sehen.

Meine Anwendung wird in einem JBoss 5 mit Hibernate ausgeführt.

Die Ansicht wird auf diese Weise definiert:

CREATE OR REPLACE VIEW V_USERACCOUNT AS
    SELECT u.USERACCOUNT_ID,u.USERNAME,u.INITIALS,u.COMMONNAME,u.PASSWORD,'local' AS source
        FROM "USERACCOUNT" u
    UNION
        SELECT u1.USERACCOUNT_ID,u1.USERNAME,u1.INITIALS,u1.COMMONNAME,u1.PASSWORD 'global' AS source
        FROM GLOBAL."USERACCOUNT" u1

2voto

Justin Cave Punkte 220606

Wenn die INSERT in die Tabelle und die SELECT aus dem View tatsächlich Teil derselben Datenbanktransaktion sind (was zwangsläufig bedeutet, dass sie in derselben Datenbanksitzung ausgeführt werden), wäre die neu eingefügte Zeile im View sichtbar (vorausgesetzt, die Zeile erfüllt die Kriterien, die der View verwendet, um zu bestimmen, welche Zeilen angezeigt werden sollen). Wenn der neue Benutzer nicht in der Ansicht ist, bedeutet dies, dass entweder

  1. El INSERT und die SELECT nicht Teil der gleichen Datenbanktransaktion sind, oder
  2. El INSERT ist nicht ausreichend, um die Zeile in der Ansicht verfügbar zu machen. Vielleicht gibt es eine andere Nachschlagetabelle, die mit der Ansicht verbunden ist, die nicht über die Daten für die neue Zeile verfügt, wenn Sie die Ansicht abfragen, aber die Nachschlagetabelle wird später in der Transaktion aufgefüllt.
  3. Sie haben irgendwo in Ihrem Code einen Fehler, bei dem die INSERT nicht wirklich passiert, wenn Sie denken, dass es passiert, oder die Abfrage nicht nach der INSERT oder die Abfrage trifft nicht auf die von Ihnen angegebene Ansicht.

Ausgehend von Ihrer letzten Aktualisierung scheint es, dass Nr. 1 mit ziemlicher Sicherheit das Problem ist. Wenn Sie verschiedene DataSources haben, wird die INSERT verwendet eine DataSource, und die SELECT eine zweite DataSource verwendet, finden die beiden Vorgänge nicht in derselben Datenbanktransaktion statt. Sie können in derselben Transaktion des Anwendungsservers stattfinden - der Anwendungsserver kann durchaus eine verteilte Transaktion erstellen -, aber wenn es sich nicht um dieselbe Datenbanktransaktion handelt, werden Sie nicht in der Lage sein, unbestätigte Änderungen zu sehen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X